我正在为控制器和服务层(C#,MVC)进行单元测试。我正在使用Moq dll来模拟单元测试中的真实/依赖对象。
但是我对模拟依赖项或真实对象有点困惑。让我们以下面的单元测试方法为例:
[TestMethod]
public void ShouldReturnDtosWhenCustomersFound_GetCustomers ()
{
// Arrrange
var name = "ricky";
var description = "this is the test";
// setup mocked dal to return list of customers
// when name and description passed to GetCustomers method
_customerDalMock.Setup(d => d.GetCustomers(name, description)).Returns(_customerList);
// Act
List<CustomerDto> actual = _CustomerService.GetCustomers(name, description);
// Assert
Assert.IsNotNull(actual);
Assert.IsTrue(actual.Any());
// verify all setups of mocked dal were called by service
_customerDalMock.VerifyAll();
}
在上面的单元测试方法中,我在模拟GetCustomers方法并返回客户列表。哪个已经定义。如下图所示:
List<Customer> _customerList = new List<Customer>
{
new Customer { CustomerID = 1, Name="Mariya",Description="description"},
new Customer { CustomerID = 2, Name="Soniya",Description="des"},
new Customer { CustomerID = 3, Name="Bill",Description="my desc"},
new Customer { CustomerID = 4, Name="jay",Description="test"},
};
让我们来看看“客户断言”模拟对象和实际对象断言:
Assert.AreEqual(_customer.CustomerID, actual.CustomerID);
Assert.AreEqual(_customer.Name, actual.Name);
Assert.AreEqual(_customer.Description, actual.Description);
但是在这里我不理解它(在单元测试之上)总是可以正常工作。意味着我们只是在测试(通过断言)已通过或正在返回的(在模拟对象中)。而且我们知道实际对象将始终返回我们传递的列表或对象。
那么在这里进行单元测试或模拟是什么意思呢?
模拟的真正目的是实现真正的隔离。
假设您有一CustomerService
堂课,这取决于CustomerRepository
。您编写了一些涵盖所提供功能的单元测试CustomerService
。他们都通过了。
一个月后,进行了一些更改,突然您的CustomerServices
单元测试开始失败-您需要查找问题出在哪里。
因此,您假设:
因为测试的单元测试
CustomerServices
失败,所以问题一定出在该类中!!
正确的?错误的!该问题可能是CustomerServices
由于其或取决于其存在的CustomerRepository
。如果其任何依赖项失败,则被测类也有可能失败。
现在,想象一下巨大的依赖关系链:A
依赖B
,B
依赖C
,...Y
依赖Z
。如果在中引入了错误Z
,则所有单元测试都将失败。
这就是为什么您需要将被测类与其依赖项(可能是域对象,数据库连接,文件资源等)隔离开来。您要测试一个单元。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句