3

データ リポジトリ オブジェクトをモックしようとしていますが、MockRepository に期待値を設定すると、毎回 null が返されます。私のコードは次のとおりです。

    [Test]
    public void GetById_NotNull()
    {
        Person expectedPerson = new Person() { Id = 1, Name="Jon"};

        MockRepository MockRepository = new MockRepository();
        var FakePersonRepository = MockRepository.StrictMock<IRepository<Person>>();

        FakePersonRepository.Expect(action => action.Get(1)).IgnoreArguments().Return(expectedPerson);

        PersonService PersonService = new PersonService(FakePersonRepository);
        Person returnedPerson = PersonService.Get(1);

        Assert.IsNotNull(returnedPerson);
    }

    //and inside my person service
    public class PersonService
    {
         private IRepository<Person> _PersonRepository;
         public PersonService(IRepository<Person> PersonRepository)
         {
           this._PersonRepository = PersonRepository;
         }

         public Person Get(int Id)
         {
             Person p = _PersonRepository.Get(Id);
             return p;
          }
    }

Test の下部にあるアサーションは失敗し、返された人は常に null です。私は自分のモックで何か間違ったことをしているに違いないことを知っています....アイデア?

4

5 に答える 5

6

してみてください

mockRepository.ReplayAll()

Expectを設定した行の後。

于 2009-04-07T16:38:57.613 に答える
4

他の人が言っているように、私はあなたが使用しているテストのスタイルでどこかでリプレイが必要になると信じています。別の方法として、リプレイを必要としない静的なMockRepository.GenerateMock <>()/ MockRepository.GenerateStub <>()メソッドとともに新しいAAA構文を使用することもできます。

于 2009-04-07T16:59:22.977 に答える
2

クリスはここでお金を稼いでいます。このシナリオでは、AAA 構文と GenerateStub の使用が最適です。

var FakePersonRepository = MockRepository.GenerateStub<<IRepository<Person>>();
FakePersonRepository.Stub(x => x.Get(1)).Returns(expectedPerson);

PersonService PersonService = new PersonService(FakePersonRepository);
Person returnedPerson = PersonService.Get(1);
于 2009-11-23T09:54:18.050 に答える
2

私は RhinoMocks にあまり詳しくありません (私は Moq を使用しています) が、できませんでした:

FakePersonRepository.Expect(action => action.Get(1)).IgnoreArguments().Return(expectedPerson);

なれ

FakePersonRepository.Expect(action => action.Get(1)).Return(expectedPerson);

また、RM で Replay() が必要だと思います。

于 2009-04-07T16:43:23.250 に答える
0

AAA 構文と GenerateMock を使用すると、PersonRepository が正しいパラメーターと正しい回数で呼び出されていることを確認することもできます。

Person expectedPerson = new Person() { Id = 1, Name="Jon"}; 

MockRepository MockRepository = new MockRepository(); 
var FakePersonRepository = MockRepository.GenerateMock<IRepository<Person>>(); 

FakePersonRepository.Expect(action => action.Get(1)).Return(expectedPerson).Repeat.Once(); 
PersonService PersonService = new PersonService(FakePersonRepository); 
Person returnedPerson = PersonService.Get(1); 

Assert.IsNotNull(returnedPerson); 
FakePersonRepository.VerifyAllExpectations();
于 2010-10-05T15:04:03.800 に答える