2010-02-05 86 views
3

我正在嘗試使用RhinoMocks,我不得不說我是一個新手,可能我在這裏沒有得到一些明顯的東西。我在做什麼是一樣的東西:使用RhinoMocks進行簡單嘲弄的問題.NET

[TestMethod] 
    public void SaveResponsibleUserFromChangeset() 
    { 
     var action = mocks.StrictMock<GenomeAction>(); 
     var changeset = new ActionChangeset(); 

     changeset.ResponsibleUser = new ChangeableProperty<UserIdentity>("Administrator") {IsChanged = true}; 
     changeset.MarkAll(true); 

     using(mocks.Record()) 
     { 
      Expect.Call(action.ResponsibleUser).SetPropertyAndIgnoreArgument(); 
     } 

     using(mocks.Playback()) 
     { 
      var persistor = new ActionPersistor(new MockIdentityResolver()); 
      persistor.SaveActionChanges(changeset, action); 
     } 

     action.VerifyAllExpectations(); 
    } 

    private class MockIdentityResolver : IIdentityResolver 
    { 
     public GenomeUser GetUser(UserIdentity identity) 
     { 
      var user = mocks.DynamicMock<GenomeUser>(); 
      user.Username = identity.Username; 
      return user; 
     } 
    } 

的目的是有一個非常簡單的測試,檢查SaveActionChanges方法是否設置ResponsibleUser財產。作爲其中的一部分,它需要使用解析器解析用戶身份,爲此我提供了一個模擬實現。不幸的是,似乎我不能在回放模式下返回另一個模擬,因爲它說(在第二個使用的閉括號中)當對象(類型GenomeUser)處於記錄狀態時,該動作無效

是什麼導致麻煩以及如何克服它的任何想法?

回答

4

我認爲你需要在mocks.Playback()以外創建你new MockIdentityResolver()

[TestMethod] 
public void SaveResponsibleUserFromChangeset() 
{ 
    var action = mocks.StrictMock<GenomeAction>(); 
    var changeset = new ActionChangeset(); 
    var identityResolver; 
    changeset.ResponsibleUser = new ChangeableProperty<UserIdentity>("Administrator") {IsChanged = true}; 
    changeset.MarkAll(true); 

    using(mocks.Record()) 
    { 
     Expect.Call(action.ResponsibleUser).SetPropertyAndIgnoreArgument(); 
     identityResolver = new MockIdentityResolver() 
    } 

    using(mocks.Playback()) 
    { 
     var persistor = new ActionPersistor(identityResolver); 
     persistor.SaveActionChanges(changeset, action); 
    } 

    action.VerifyAllExpectations(); 
} 

private class MockIdentityResolver : IIdentityResolver 
{ 
    public GenomeUser GetUser(UserIdentity identity) 
    { 
     var user = mocks.DynamicMock<GenomeUser>(); 
     user.Username = identity.Username; 
     return user; 
    } 
} 

你應該看看使用AAA syntax,它似乎被普遍接受,這是一個使用的東西更清晰的方式。

+0

我已經使用了你的建議,並用AAA語法完全重寫了這個東西,現在它的功能就像魅力一樣。謝謝;) – 2010-02-05 17:40:30

+0

+1也提到了優越的AAA語法 – 2010-02-05 23:08:03

+0

來自我的AAA語法的另一個+1; Rhino Mocks的作者Oren Eini已經提到他的框架的下一個版本將取消Record/Playback語法,並且只提供AAA語法。 – 2010-04-23 14:37:44