【问题标题】:Why am I getting this error : requires a return value or an exception to throw?为什么我会收到此错误:需要返回值或抛出异常?
【发布时间】:2013-02-03 19:59:55
【问题描述】:

我在尝试运行测试时收到以下错误。我试过 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");
        }

【问题讨论】:

  • 那么您的服务调用是什么样的?它是真的如此薄的一层,它只是将请求逐字传递到您的存储库吗?
  • 重要的不是你可以拥有什么——而是你的代码有什么
  • @JonSkeet,我把它放在上面的编辑中。
  • 现在您已经显示了 一个 服务调用,但是您在测试中进行了两个...
  • @JonSkeet,现在添加了另一个服务调用。

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


【解决方案1】:
        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);
        }

我都测试了,都可以。

【讨论】:

  • 谢谢,当你得到更多细节时告诉我。
【解决方案2】:

不是 100% 肯定,但将其作为答案删除,以便您可以轻松阅读答案/评论。 如果这不是解决方案,请告诉我,然后我会删除答案以避免混淆。

我认为你的问题出在

Expect.Call(()=&gt;productRepository.SaveProduct(product))

您已经处于录制模式 (mock.Ordered()),因此无需指定 Expect.Call()

Expect.Call() 要求返回值。您只是在寻找一种方法来验证方法 save 是否被调用。

我认为您应该将代码更改为:

        using (mock.Ordered())
        {
            Expect.Call(productRepository
                .GetAllProducts())
                .IgnoreArguments()
                .Return(new ArrayList());
            productRepository.SaveProduct(product);
        }

(您可能认为您在测试方法中调用了 SaveProduct,但您不会,RhinoMocks 比这更聪明,并且会记录这个 void 调用)

【讨论】:

  • 我在上面尝试了你的建议,我仍然遇到同样的错误。保留此答案,因为它提供有关工作或 Ordered 和 Expect 的信息。
  • k 等一下,我会尝试重现您的错误。需要启动 VS。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 2022-01-14
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 2011-09-10
  • 2018-06-22
相关资源
最近更新 更多