编写一个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,其中有三个依赖项:SqliteDbContextILogger<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;
_foo = foo;
_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

  • 修改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));
}
  • 测试结果

最新文章

  1. 【热门技术】EventBus 3.0,让事件订阅更简单,从此告别组件消息传递烦恼~
  2. HTTP相关函数
  3. JSP开发模式2(计算器)
  4. Server.mappath用法
  5. oracle数据学习第二天
  6. Spring IOC容器中注入bean
  7. 高手详解SQL性能优化十条建议
  8. 转 XenServer、XenCenter安装测试
  9. java NIO-我们到底能走多远系列(39)
  10. [HDOJ2546] 饭卡 (01背包)
  11. prim求MST
  12. Hibernate学习笔记(1)
  13. Android中一个类实现的接口数不能超过七个
  14. 为MySQL选择合适的备份方式[转]
  15. Linux IPC实践(9) --System V共享内存
  16. 六、文件IO——fcntl 函数 和 ioctl 函数
  17. django-内网项目上线测试部署步骤
  18. ABAP-表中数据的横向累加
  19. Abp问题解决集合1
  20. DataSet和实体类的相互转换

热门文章

  1. cogs 1316. 数列操作B 区间修改 单点查询
  2. NTT 求原根
  3. C++ 中的 unique 函数
  4. 百度DMA+小度App的蓝牙语音解决方案案例展示
  5. Linux安装python和更新pip
  6. redis 数据类型之字典
  7. 轻松理解 Kubernetes 的核心概念
  8. python 继承机制(子类化内置类型)
  9. CF572_Div2_D2
  10. 1755: N相关孪生素数