Paw*_*wan 8 c# unit-testing mocking
我正在为我的控制器和服务层(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();
}
Run Code Online (Sandbox Code Playgroud)
在上面的单元测试方法中,我正在模拟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"},
};
Run Code Online (Sandbox Code Playgroud)
让我们来看看客户的Assertion模拟对象和实际对象断言: -
Assert.AreEqual(_customer.CustomerID, actual.CustomerID);
Assert.AreEqual(_customer.Name, actual.Name);
Assert.AreEqual(_customer.Description, actual.Description);
Run Code Online (Sandbox Code Playgroud)
但在这里我并不理解它(在单元测试之上)总能正常工作.意味着我们只是测试(在Assertion中)我们传递的或我们正在返回的(在模拟对象中).我们知道真实/实际对象将始终返回我们传递的列表或对象.
那么在这里进行单元测试或嘲笑是什么意思呢?
嘲笑的真正目的是实现真正的孤立.
假设你有一个CustomerService课程,这取决于一个CustomerRepository.您编写了一些单元测试,涵盖了提供的功能CustomerService.他们都过去了.
一个月后,进行了一些更改,突然您的CustomerServices单元测试开始失败 - 您需要找到问题所在.
所以你假设:
因为测试
CustomerServices失败的单元测试,问题必须在那个类!!
对?错误!问题可能在CustomerServices其依赖关系中,也可能在其任何依赖关系中,即CustomerRepository.如果它的任何依赖关系失败,那么被测试的类也可能会失败.
现在想象一个巨大的依赖链:A取决于B,B取决于C,...... Y取决于Z.如果引入了故障Z,则所有单元测试都将失败.
这就是为什么你需要将测试中的类与其依赖关系隔离开来(可能是域对象,数据库连接,文件资源等).你想测试一个单位.
| 归档时间: |
|
| 查看次数: |
1833 次 |
| 最近记录: |