.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,其中有三个依赖项:SqliteDbContextILoggerIFoo
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
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));
}
  • 测试结果
    在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部