2011-03-17 56 views
0

我仍然在試圖讓我的周圍嘲弄頭。現在,我試圖在我的UserService上測試我的Save方法。因此,我正在嘲笑我的類庫使用的IRepository。不知道我怎麼莫克這個簡單的保存(用戶用戶)方法在我的.NET代碼

我不明白的是...如果我通常這個用戶保存到我的DB /存儲庫,它奇蹟般地得到一個身份,它隨後被設置成我的實例對象。沒有火箭科學的東西,在這裏。

的,我怎麼嘲笑這個我不明白?我應該關心嗎?我認爲我應該。或者..是我不關心那個..因爲我只是確保Repository方法被調用..不是那麼多,我從它得到正確的數據返回。

這裏是我的僞單元測試代碼。 (單元測試,不集成測試..因此mock'd庫)...

[TestMethod] 
public void GivenANewUserWithValidData_Save_ReturnsTheSameNewUserWithAUserIdDetermined() 
{ 
    // Arrange. 
    var const string passwordSalt = "V4BXAhmHq8IMvR7K20TgoQ==" 
    var user = new User 
        { 
         DisplayName = "Test", 
         Email = "[email protected]", 
         PasswordSalt = passwordSalt , 
         Password = "foobar".ToSha2Hash(passwordSalt) 
        }; 

    var mockUserRepository = new Mock<IRepository<User>>(); 
    mockUserRepository.Setup(x => x.Save(It.IsAny<User>())).Verifiable(); 
    // Configure this repo in our Dependency Injection. 
    ObjectFactory.Inject(typeof (IRepository<User>), mockUserRepository.Object); 

    // Act. 
    using (new TransactionScope()) 
    { 
     UserService.Save(user); 
     UnitOfWork.Commit(); // <-- not sure about this.. currently it's still 
          //  an EntityFramework context. 
          //  I need to change this to.. something?? 

     // Assert. 
     Assert.IsNotNull(user); 
     Assert.IsTrue(user.UserId > 0); 
    } 
} 

和用戶服務看起來是這樣的..

public class UserService : IUserService 
{ 
    public UserService(IRepository<User> userRepository, 
         ILoggingService loggingService) 
    { 
     // .. snip .. 

     public void Save(User user) { .. } 
    } 
} 

有什麼建議?

+0

是您qestion「如何嘲笑'Identity-Magic'」或「如何單元測試'Identity-Magic'」或其他什麼東西? – k3b 2011-03-17 03:42:43

+0

@ k3b - 我的問題分兩部分。 1)我應該如何測試Save方法?我應該關心結果嗎? 2)如果我真的關心#1 ..那麼我怎麼嘲笑結果,所以我可以測試。 – 2011-03-17 04:24:18

回答

1
> 1) How should I test a [UserService.]Save method? 
    Should I care about the result? and 
> 2) If i do care about #1 .. then how do i mock the 
    result also, so I can test that 

如果庫負責做Identity-Magic那麼它是沒有意義的測試嘲笑這個功能,然後驗證此功能在測試中發生的事情。 你想測試UserService而不是IRepository-mock。這個模擬是在那裏創造一個虛假的存儲庫,只要有足夠的智能,服務就不會崩潰,並獲得測試用例的所有需求。在這種情況下,我不認爲服務需要Identity-Magic

如果服務負責執行Identity-Magic那麼它使得可以測試是否已經設置了id。

2

這實際上很容易做到。您正在設置模擬對象,像這樣:

mockUserRepository.Setup(x => x.Save(user)).Callback(() => user.UserId = 10); 
// mocking the value of 10 being insterted into the key 

你甚至可以繼續使用It.IsAny()如果​​你想在安裝程序,但基本上所有你需要做的是回調附加到年底你的設置方法。

3

如果你是單元測試UserService.Save(),那麼你所有的測試應該關心的是,庫被調用。存儲庫測試的責任是驗證對象是否正確保存。

相關問題