c# - 为什么我收到此错误 : requires a return value or an exception to throw?

标签 c# unit-testing tdd rhino-mocks

当我尝试运行测试时,出现以下错误。我尝试过 IgnoreArguments() ,但这似乎不起作用。仅当我尝试 mock.Ordered() 时才会抛出此异常,如果我执行 mock.Record() 则它过去了。

System.InvalidOperationException : Previous method 'IProductRepository.GetAllProducts();' requires a return value or an exception to throw.


 [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");
        }

最佳答案

        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);
        }

我测试了两者,都有效。

关于c# - 为什么我收到此错误 : requires a return value or an exception to throw?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14676652/

相关文章:

c# - 从后面的代码添加用户控件

c# - WinForm 弹出窗体与父级的关系

android - 使用 gradle 仅在一个构建变体上运行单元测试

java - Spring Rest Controller 测试中的 NullPointer 异常 - Java

android - 单元测试逼真的Android类。测试环境,生命周期和响应

c# - protobuf-csharp-端口

c# - 将 JsonMediaTypeFormatter 应用于 Json

.net - 模拟对象 - 将所有方法声明为虚拟方法还是使用接口(interface)?

git - 如何在等待测试运行时同时在多个分支上工作?

tdd - 用户故事结束时的集成卡 (TDD)