【问题标题】:Rhino Mocks: Mocked method returns nullRhino Mocks:模拟方法返回 null
【发布时间】:2009-04-07 16:36:16
【问题描述】:

我正在尝试模拟一个数据存储库对象,但是在对我的 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;
          }
    }

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

【问题讨论】:

    标签: mocking rhino-mocks


    【解决方案1】:

    尝试做一个

    mockRepository.ReplayAll()
    

    在您设置 Expect 的那一行之后。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我对 RhinoMocks 不是很熟悉(我一直在使用 Moq),但不能:

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

        成为

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

        我也认为你需要一个带有 RM 的 Replay()。

        【讨论】:

        • 是的,IgnoreArguments 是多余的。这是我错过的重播。
        【解决方案4】:

        克里斯在这里很赚钱。 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);
        

        【讨论】:

          【解决方案5】:

          使用 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();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-30
            • 1970-01-01
            • 2010-12-03
            相关资源
            最近更新 更多