2013-08-22 64 views
0

我想測試我的void存儲庫。我的服務類是這樣的。存儲庫的單元測試void方法

public class AccountService 
{ 
    private readonly IAccountRepository accountRepository; 

    public AccountService(IAccountRepository accountRepository) 
    { 
     this.accountRepository = accountRepository; 
    } 

    public User GetById(string userId) 
    { 
     User user = accountRepository.GetById(userId); 

     if (user == null) 
      throw new UserNotFoundException(); 

     return user; 
    } 

    public void Add(User user) 
    { 
     accountRepository.Add(user); 
    } 
} 

在我的測試類中,我創建了一個使用FakeItEasy工具的假庫。

[TestFixture] 
public class AccountServiceTests 
{ 
    private IAccountRepository repository; 
    private AccountService service; 

    private string ValidUserId = "aaa"; 
    private string InvalidUserId = "xxx"; 

    private List<User> getUsers() 
    { 
     return new List<User> {new User {UserId = ValidUserId}}; 
    } 

    private readonly User newUser= new User(); 

    [SetUp] 
    public void Setup() 
    { 
     repository = A.Fake<IAccountRepository>(); 
     service = new AccountService(repository); 

     A.CallTo(() => repository.GetById(ValidUserId)) 
      .Returns(new User{UserId = ValidUserId}); 

     A.CallTo(() => repository.GetById(InvalidUserId)) 
      .Returns(null); 

     A.CallTo(() => repository.Add(A<User>.Ignored)) 
      .??? 
    } 

    [Test] 
    public void GetUser_ValidUserId_ReturnsUser() 
    { 
     User user = service.GetById(ValidUserId); 

     Assert.IsNotNull(user); 
     Assert.AreEqual(ValidUserId, user.UserId); 
    } 

    [Test, ExpectedException(typeof(UserNotFoundException))] 
    public void GetUser_InValidUserId_ThrowsUserNotFoundException() 
    { 
     service.GetById(InvalidUserId); 
    } 

    [Test] 
    public void Add_User_AddsUser() 
    { 
     service.Add(newUser); 
    } 
} 

我可以測試GetUser方法的成功。但我無法測試我的服務類中的Add方法。因爲它沒有返回任何東西。或者我的服務類沒有包含用戶查詢狀態的列表。你對測試這個void方法有什麼建議?

回答

0

按照FakeItEasy documentation,您可以使用.MustHaveHappened()方法即

[Test] 
public void Add_User_AddsUser() 
{ 
    service.Add(newUser); 
    A.CallTo(() => repository.Add(A<User>.Ignored)).MustHaveHappened();   
} 
+0

拿什麼MustHaveHappened,wtiting只有在文檔斷言。我應該在service.Add(newUser)後使用它嗎? – barteloma

+0

「必須發生」檢查在您調用service.Add()時,repository.Add()已被調用。如果沒有調用repository.Add(),則測試將失敗。如果有,測試將通過。 通過檢查repository.Add()被調用,您斷言調用service.Add()會調用存儲庫。然後由存儲庫來實際添加用戶。 – Dan