2012-12-03 28 views
2
public User AddTags(int userId, List<Tag> Tags) 
      { 
       var user = GetUserById(userId); 
       Tags.ForEach(tag => user.Tags.Add(tag)); 
       return _repository.Update(user); 
      } 
public interface IRepository<T> where T:class 
    { 
     void Add(T item); 
     void Remove(T item); 
     T Update(T item); 
    } 

在測試類如何對單元測試以下方法?

protected IRepository<User> Repository; 
protected UserService Service; 
public Mock<IRepository<User>> MockUserRepository = new Mock<IRepository<User>>(); 
Repository = MockUserRepository.Object; 
Service = new UserService(UnitOfWork, Repository); 
//I don't quite understand how to mock the Update method. 
var result = Service.AddUserTags(1,Tags); 
Assert.AreEqual(result.UserTags.Count(),3); 

我有一個List<User> usersList<Tag> tags

我使用EF,NUnit,MOQ和通用存儲庫模式。

編輯:

在GetUserById

return _repository.GetAll().Where(_ => _.UserId == userId).SingleOrDefault(); 

I have mocked it doing the following 

MockUserRepository.Setup(_ => _.GetAll()).Returns(Users.AsQueryable()); 

回答

2

我取決於GetUserById(userId);會發生什麼。爲了檢查UserTags的計數,您必須通過嘲笑GetUserId來控制返回的User

否則,你能做的最好的就是確保該Update方法被稱爲:

編輯
repository.Verify(x => x.Update(It.IsAny<User>())); 

後: 然後,你需要設置用戶:

[TestFixture] 
    public class TestPointer 
    { 
     private IRepository<User> Repository; 
     private UserService Service; 
     private Mock<IRepository<User>> MockUserRepository = new Mock<IRepository<User>>(); 

     [Test] 
     public void GetItemsByUserName_UserName_ListOfItems() 
     { 
      //Arrange 
      var unitOfWork = new UnitOfWork(); 
      Service = new UserService(unitOfWork, MockUserRepository.Object); 
      var Tags = new List<Tag>() { new Tag { Name = "TestTag1" }, new Tag { Name = "TestTag2" }, new Tag { Name = "TestTag3" } }; 
      var user = new User() {Id = 1}; 
      MockUserRepository.Setup(x => x.Find(1)).Returns(user); 
      MockUserRepository.Setup(x => x.Update(user)).Returns(user); 

      //Act 
      var result = Service.AddTags(1, Tags); 


      //Assert 
      Assert.AreEqual(result.Tags.Count(),3); 
     } 
    } 

    public class UserService 
    { 
     private IRepository<User> _repository; 
     private UnitOfWork _unitOfWork; 

     public UserService(UnitOfWork unitOfWork, IRepository<User> repository) 
     { 
      _unitOfWork = unitOfWork; 
      _repository = repository; 
     } 

     public User AddTags(int userId, List<Tag> Tags) 
     { 
      var user = GetUserById(userId); 
      Tags.ForEach(tag => user.Tags.Add(tag)); 
      return _repository.Update(user); 
     } 

     private User GetUserById(int userId) 
     { 
      return _repository.Find(userId); 
     } 
    } 

    public class UnitOfWork 
    { 

    } 

    public interface IRepository<T> where T:class 
    { 
     T Find(int id); 
     void Add(T item); 
     void Remove(T item); 
     T Update(T item); 
    } 

    public class User 
    { 
     private List<Tag> tags = new List<Tag>(); 

     public int Id { get; set; } 
     public List<Tag> Tags 
     { 
      get { return tags; } 
      set { tags = value; } 
     } 
    } 

    public class Tag 
    { 
     public string Name { get; set; } 
    } 
+0

請參閱我的編輯。 –

+0

添加標籤後不應該計數爲4,不會有真正的更新發生? –

+0

你怎麼得到4?我添加了3個標籤,是嗎?而且,沒有真正的更新發生,因爲我們正在嘲笑存儲庫。 –

0

如果你想斷言用戶發生了什麼,應該注入GetuserById方法,所以它可以被模擬代替,返回一個模擬用戶。然後您可以驗證,user.Tags.Add(tag)被稱爲正確的次數。

之後,您可以驗證_repository.Update(user)被稱爲一次;

對於Moq中的通訊語法,請檢查this鏈接。

+0

我是否應該檢查正確的呼叫次數?如果我對列表進行foreach,那麼除了檢查空值之外,這種Assert的用途是什麼? –

+0

它驗證你的循環中的邏輯是正確的,所以我會這麼說,eventhoug的邏輯是直截了當的。 – Morten