2009-04-07 14 views
3

Ich versuche, ein Datenrepository-Objekt zu verspotten, aber nachdem ich eine Erwartung für mein MockRepository gesetzt habe, gibt es jedes Mal null zurück. Mein Code ist wie folgt: Rhino Mocks: Mocked-Methode gibt null zurück

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

Die Behauptung am Ende des Tests fehlschlägt und zurückgegebene Person ist immer Null. Ich weiß, dass ich mit meinen gespielten Ideen etwas falsch machen muss.

Antwort

2

Chris ist auf dem Geld hier. Die AAA-Syntax und die Verwendung von GenerateStub für dieses Szenario ist am besten.

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

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

Versuchen Sie, eine

mockRepository.ReplayAll() 

nach der Zeile zu tun, wo Sie Ihre Erwarten eingestellt.

2

ich mit RhinoMocks nicht super vertraut bin (ich habe mit Moq), konnte aber nicht:

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

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

sein Ich denke auch, müssen Sie eine Replay() mit RM.

+1

die IgnoreArguments Ja ist überflüssig. Es ist die Wiederholung, die ich vermisste. –

4

Wie andere gesagt haben, glaube ich, dass Sie eine Replay irgendwo mit dem Stil der Tests benötigen werden, die Sie verwenden; Als Alternative könnten Sie das newer AAA Syntax zusammen mit dem statischen MockRepository.GenerateMock <>()/MockRepository.GenerateStub <>() Methoden verwenden, die Replay nicht erfordern würden.

0

Mit der AAA-Syntax und GenerateMock Sie können auch überprüfen, ob PersonRepository mit den richtigen Parameter und die korrekte Anzahl, wie oft aufgerufen wird:

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