【问题标题】:Testing Using NUnit and Moq: use case使用 NUnit 和 Moq 进行测试:用例
【发布时间】:2018-08-23 14:15:18
【问题描述】:
我有一个管理USER 实体的业务类。
在这个类中,我有一个方法可以通过 id 返回单个用户:
public Utente GetUser(int id)
{
var utente = _userDataManager.GetUserById(id);
return _mapper.Map<Utente>(utente);
}
_userDataManager是一个接口,IUSERDATAMANAGER,它已经实现了一个DAL类; GetUserById 返回用户或null(使用 EF6 进行搜索)。
_mapper 是一个IMAPPER 接口(自动映射器)。
方法返回的是映射的对象。
我有两个问题:
测试这个方法有意义吗?
我应该同时模拟这两个对象吗?
一个黑盒示例将不胜感激。
【问题讨论】:
标签:
unit-testing
entity-framework-6
nunit
integration-testing
moq
【解决方案1】:
测试这个方法有意义吗?
如果值得编写代码,那么值得测试代码。
我应该同时模拟这两个对象吗?
当测试一个被测对象时,你模拟了可以让测试完成的依赖关系。
例如
public void GetUser_Should_Return_Utente() {
//Arrange
var userId = 2;
var user = new User {
UserId = userId,
//... other properties
};
var userDataManagerMock = new Mock<IUserDataManager>();
userDataManagerMock.Setup(_ => _.GetUserById(userId)).Returns(user);
var expected = new Utente {
Id = user.Id,
//...other properties
}
var mapperMock = new Mock<IMapper>();
mapperMock.Setup(_ => _.Map<Utente>(It.IsAny<object>())).Returns(expected);
var subject = new MyBusinessClass(userDataManagerMock.Object, mapperMock.Object);
//Act
var actual = subject.GetUser(userId);
//Assert
Assert.Equal(expected, actual);
}
在上面的代码中,用户数据管理器和映射器在测试GetUser 方法时被模拟并注入到主题中。
这是对上述方法的独立单元测试,并显示该方法的当前实现将完成,前提是依赖项在调用期间按预期执行。