当我尝试运行测试时出现以下错误。我已经尝试了 IgnoreArguments()
,但这似乎没有办法解决问题。只有当我 mock.Ordered()
mock.Record()
然后通过时才会抛出此异常。
System.InvalidOperationException:上一个方法 'IProductRepository.GetAllProducts();'需要返回值或 抛出异常。
[Test]
public void TestwithOrderedRecordsandPlayBack()
{
var mock = new MockRepository();
var productRepository = mock.StrictMock<IProductRepository>();
var product = new Grains
{
Name = "Wonder Bread",
Category = "Grains"
};
IList list = new ArrayList();
//Class under test
var service = new ProductService(productRepository);
using (mock.Ordered())
{
Expect.Call(productRepository
.GetAllProducts())
.IgnoreArguments()
.Return(new ArrayList());
Expect.Call(()=>productRepository.SaveProduct(product));
}
using (mock.Playback())
{
list = service.GetAllProducts();
service.SaveProduct(product);
}
}
服务电话:
public virtual IList GetAllProducts()
{
IList list = _productRepository.GetAllProducts();
return list;
//throw new System.Exception("Not implemented");
}
public virtual IList GetAllProducts()
{
IList list = _productRepository.GetAllProducts();
return list;
//throw new System.Exception("Not implemented");
}
答案 0 :(得分:2)
using (mock.Ordered())
{
Expect.Call(productRepository
.GetAllProducts())
.IgnoreArguments()
.Return(new ArrayList());
Expect.Call(() => productRepository.SaveProduct(product));
}
这个失败了,就是你所描述的完全相同的错误。 System.InvalidOperationException:上一个方法'IProductRepository.GetAllProducts();'需要返回值或抛出异常。
原因是模拟存储库从未离开记录模式。您可能会认为(我也这样做)mock.Ordered()
将存储库置于某种有序记录状态,但事实并非如此。因此,您需要指定何时完成录制行为。
您可以通过两种方式执行此操作:
using (mock.Record())
using (mock.Ordered())
{
Expect.Call(productRepository.GetAllProducts()).Return(new ArrayList());
Expect.Call(() => productRepository.SaveProduct(product));
}
完成录制后删除mock.ReplayAll():
using (mock.Ordered())
{
Expect.Call(productRepository.GetAllProducts()).Return(new ArrayList());
Expect.Call(() => productRepository.SaveProduct(product));
}
mock.ReplayAll();
using (mock.Playback())
{
service.GetAllProducts();
service.SaveProduct(product);
}
我测试了两者,两者都有效。
答案 1 :(得分:0)
不是100%肯定,但将其作为答案删除,以便您可以轻松阅读答案/评论。 如果这不是解决方案,请告诉我,然后我会删除答案以避免混淆。
我认为你的问题在
Expect.Call(()=>productRepository.SaveProduct(product))
您已处于记录模式(mock.Ordered()
),因此无需指定Expect.Call()
。
Expect.Call()
要求返回值。您只是在寻找一种方法来验证是否正在调用方法保存。
我认为您应该将代码更改为:
using (mock.Ordered())
{
Expect.Call(productRepository
.GetAllProducts())
.IgnoreArguments()
.Return(new ArrayList());
productRepository.SaveProduct(product);
}
(你可能认为你在测试方法中调用了SaveProduct,但你不会,RhinoMocks比那更聪明并且会记录这个无效的调用)