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

测试底部的断言失败,返回的人始终为空。我知道我的模拟肯定做错了......想法?

4

5 回答 5

6

尝试做一个

mockRepository.ReplayAll()

在你设置期望的那一行之后。

于 2009-04-07T16:38:57.613 回答
4

正如其他人所说,我相信您将需要在某个地方使用您正在使用的测试风格进行重播;作为替代方案,您可以使用较新的 AAA 语法以及不需要重播的静态 MockRepository.GenerateMock<>()/MockRepository.GenerateStub<>() 方法。

于 2009-04-07T16:59:22.977 回答
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 回答
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 回答
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 回答