本文主要是介绍.NET Core之单元测试(三):Mock框架Moq的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 编写一个API
- 测试用例
编写一个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;_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()
{// Arrangevar 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);// Actvar response = await controller.Get(2);var responseModel = ((OkObjectResult)response).Value as SampleEntity;// AssertAssert.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()
{// Arrangevar 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);// Actvar response = await controller.Get(2);// AssertAssert.IsInstanceOfType(response, typeof(NotFoundResult));
}
- 测试结果
这篇关于.NET Core之单元测试(三):Mock框架Moq的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!