例如,我想测试我的多线程方法是否在从不同的线程中给它n个数据块时调用存储库方法n次。当然,模拟对象不是线程安全的,也不应该是线程安全的。
[Test]
public void CanSaveCustomersInParallel()
{
var customers = new List<List<Customer>>
{
new List<Customer>
{
new Customer {FirstName = "FirstName1"},
new Customer {FirstName = "FirstName2"}
},
new List<Customer>
{
new Customer {FirstName = "FirstName3"},
new Customer {FirstName = "FirstName4"}
}
};
_serviceCustomers.ParallelSaveBatch(customers);
_repoCustomers
.Verify(x => x.SaveBatch(It.IsAny<List<Customer>>()), Times.Exactly(2));
}
当然,这个测试有时失败,有时不会失败。但从本质上讲,它是不正确的。您能给我建议如何重新编写它吗?
lock(Mock)
,这使得模拟对象对于多线程代码完全无用。这似乎并没有“改进”... 我们不得不回滚到4.0,因为它破坏了我们的多线程/并发测试! :( - Danny Tuppeny