2

テストを実行しようとすると、次のエラーが表示されます。試してみまし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");
        }
4

2 に答える 2

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

あなたが説明したのとまったく同じエラーで、これは失敗します。System.InvalidOperationException:前のメソッド'IProductRepository.GetAllProducts();' スローするには戻り値または例外が必要です。

これは、モックリポジトリがレコードモードを離れることがないためです。mock.Ordered()リポジトリをある種の順序付けられたレコード状態にする(私もそうしました)と思うかもしれませんが、そうではありません。したがって、行動の記録がいつ終了するかを指定する必要があります。

これは2つの方法で実行できます。

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

私は両方をテストしました、両方とも動作します。

于 2013-02-03T20:39:50.070 に答える
0

100%確実ではありませんが、回答/コメントを簡単に読めるように回答として落としました. これが解決策でない場合はお知らせください。混乱を避けるために回答を削除します。

あなたの問題は

Expect.Call(()=>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 呼び出しを記録します)

于 2013-02-03T20:08:18.730 に答える