编写一个 API
新增一个接口
- public interface IFoo
- {
- bool Ping(string ip);
- }
接口实现
- public class Foo : IFoo
- {
- public bool Ping(string ip)
- {
- return new Random().Next(1, 100) % 2 == 1;
- }
- }
编写一个待测试的 API, 其中有三个依赖项: SqliteDbContext,ILogger<SampleController > 和 IFoo
API 实现的功能: 先获取 SqliteDbContext 中的 SampleEntity, 如果其中的属性 StringValue 值为 ping, 并且结果为 False, 则返回 404, 否则返回 SampleEntity
- [Route("api/[controller]")]
- [ApiController]
- public class SampleController : ControllerBase
- {
- private readonly SqliteDbContext _sqliteDbContext;
- private readonly ILogger<SampleController> _logger;
- private readonly IFoo _foo;
- public SampleController(SqliteDbContext sqliteDbContext, ILogger<SampleController> logger,IFoo foo)
- {
- _logger = logger;
- _sqliteDbContext = sqliteDbContext;
- }
- [HttpGet("{id}")]
- public async Task<IActionResult> Get(int id)
- {
- var sampleData = await _sqliteDbContext.SampleEntity
- .SingleOrDefaultAsync(s => s.Id == id);
- if (sampleData?.StringValue == "ping")
- {
- var pingOk = _foo.Ping("localhost");
- if (!pingOk)
- return NotFound();
- }
- return Ok(sampleData);
- }
- }
测试用例
- Mock
- ILogger<SampleController>
- var loggerMock = new Mock<ILogger<SampleController>>();
- var logger = loggerMock.Object;
- Mock Ping(string ip)
- var fooMock = new Mock<IFoo>();
- fooMock.Setup(foo => foo.Ping("localhost")).Returns(true);
- var foo = fooMock.Object;
关于 Moq 的更多操作可参见: Moq4 Quickstart https://github.com/Moq/moq4/wiki/Quickstart
修改
GetSqliteDbContextAsync()
, 新增一个 ID 为 2 的数据记录
- private async Task<SqliteDbContext> GetSqliteDbContextAsync()
- {
- var options = new DbContextOptionsBuilder<SqliteDbContext>()
- .UseInMemoryDatabase(Guid.NewGuid().ToString())
- .Options;
- var sqliteDbContext = new SqliteDbContext(options);
- sqliteDbContext.SampleEntity.Add(new Infrastructure.Entities.SampleEntity
- {
- Id = 1,
- BoolValue = false,
- DateTimeValue = DateTime.Now,
- StringValue = "sample"
- });
- sqliteDbContext.SampleEntity.Add(new Infrastructure.Entities.SampleEntity
- {
- Id = 2,
- BoolValue = false,
- DateTimeValue = DateTime.Now,
- StringValue = "ping"
- });
- await sqliteDbContext.SaveChangesAsync();
- return sqliteDbContext;
- }
测试 Ping==True
- [TestMethod]
- public async Task Get_ReturnOK_WithPingTrue()
- {
- // Arrange
- var dbContext = await GetSqliteDbContextAsync();
- var loggerMock = new Mock<ILogger<SampleController>>();
- var logger = loggerMock.Object;
- var fooMock = new Mock<IFoo>();
- fooMock.Setup(foo => foo.Ping("localhost")).Returns(true);
- var foo = fooMock.Object;
- var controller = new SampleController(dbContext, logger, foo);
- // Act
- var response = await controller.Get(2);
- var responseModel = ((OkObjectResult)response).Value as SampleEntity;
- // Assert
- Assert.IsInstanceOfType(response, typeof(OkObjectResult));
- Assert.IsTrue(responseModel.Id == 2);
- Assert.IsFalse(responseModel.BoolValue);
- Assert.IsTrue(responseModel.StringValue == "ping");
- }
测试 Ping==False
- [TestMethod]
- public async Task Get_ReturnOK_WithPingFalse()
- {
- // Arrange
- var dbContext = await GetSqliteDbContextAsync();
- var loggerMock = new Mock<ILogger<SampleController>>();
- var logger = loggerMock.Object;
- var fooMock = new Mock<IFoo>();
- fooMock.Setup(foo => foo.Ping("localhost")).Returns(false);
- var foo = fooMock.Object;
- var controller = new SampleController(dbContext, logger, foo);
- // Act
- var response = await controller.Get(2);
- // Assert
- Assert.IsInstanceOfType(response, typeof(NotFoundResult));
- }
测试结果
来源: https://www.cnblogs.com/zhaobingwang/p/12354045.html