为什么我会收到此错误:需要返回值或抛出异常?

时间:2013-02-03 19:59:56

标签: c# unit-testing tdd rhino-mocks

当我尝试运行测试时出现以下错误。我已经尝试了 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");
        }

2 个答案:

答案 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比那更聪明并且会记录这个无效的调用)