c# - 如何对以下方法进行单元测试?

标签 c# entity-framework unit-testing nunit moq

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> users和一个 List<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());

最佳答案

我取决于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; }
    }

关于c# - 如何对以下方法进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13679960/

相关文章:

c# - 获取卡中的 token 以从个人资料中检索用户图像

c# - Youtube Windows Store App API

c# - 将连接字符串传递给 Entity Framework 6

javascript - AngularJS:在 $httpBackend.flush() 之前需要 $digest

unit-testing - 打开 NUnit 的卷影复制时,如何将资源(任何内容)文件复制到输出文件夹?

c# - 推荐用于在 C# 中处理 xml 配置文件的类?

c# - Emgu CV 捕获类不存在

linq - 将 linq 结果转换为 List<MyInterface>

c# - LINQ to Entities 无法识别该方法并且无法将此方法转换为存储表达式

C数组比较