Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对以下方法进行单元测试?_C#_Entity Framework_Unit Testing_Nunit_Moq - Fatal编程技术网

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

C# 如何对以下方法进行单元测试?,c#,entity-framework,unit-testing,nunit,moq,C#,Entity Framework,Unit Testing,Nunit,Moq,我取决于GetUserById(userId)中发生的事情。为了检查UserTags的计数,必须通过模拟GetUserId来控制返回的User 否则,您最好确保调用Update方法: return _repository.GetAll().Where(_ => _.UserId == userId).SingleOrDefault(); I have mocked it doing the following MockUserRepository.Setup(_ => _.Ge

我取决于
GetUserById(userId)中发生的事情。为了检查
UserTags
的计数,必须通过模拟
GetUserId
来控制返回的
User

否则,您最好确保调用
Update
方法:

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

I have mocked it doing the following 

MockUserRepository.Setup(_ => _.GetAll()).Returns(Users.AsQueryable());
repository.Verify(x=>x.Update(It.IsAny());
编辑后: 然后,您需要设置用户:

repository.Verify(x => x.Update(It.IsAny<User>()));
[TestFixture]
公共类测试指针
{
私有存储库;
私人用户服务;
私有Mock MockUserRepository=new Mock();
[测试]
public void GetItemsByUserName\u用户名\u列表项()
{
//安排
var unitOfWork=新的unitOfWork();
服务=新用户服务(unitOfWork,MockUserRepository.Object);
var Tags=new List(){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);
//表演
var result=Service.AddTags(1,Tags);
//断言
Assert.AreEqual(result.Tags.Count(),3);
}
}
公共类用户服务
{
私人IRepository_存储库;
私人工作单位(Unitof Work);;
公共用户服务(UnitOfWork UnitOfWork,IRepository存储库)
{
_unitOfWork=unitOfWork;
_存储库=存储库;
}
公共用户AddTags(int userId,List Tags)
{
var user=GetUserById(userId);
Tags.ForEach(tag=>user.Tags.Add(tag));
返回_repository.Update(用户);
}
私有用户GetUserById(int userId)
{
return\u repository.Find(userId);
}
}
公营单位
{
}
公共接口IRepository,其中T:class
{
T Find(int-id);
无效添加(T项);
消除无效(T项);
T更新(T项);
}
公共类用户
{
私有列表标记=新列表();
公共int Id{get;set;}
公共列表标签
{
获取{return tags;}
设置{tags=value;}
}
}
公共类标签
{
公共字符串名称{get;set;}
}

如果您想断言用户发生了什么,那么应该插入
GetuserById
方法,这样它就可以被一个mock替换,它返回一个mock用户。然后,您可以验证调用
user.Tags.Add(tag)
的次数是否正确

之后,您可以验证是否一次调用了
\u repository.Update(user)


有关Moq中的veryfication语法,请检查链接

添加标记后,计数不应该是4吗?似乎没有真正的更新发生?如何得到4?我添加了3个标签,是吗?而且,没有真正的更新发生,因为我们正在模拟存储库。我应该检查正确的调用次数吗?如果我对列表进行foreach,那么除了检查null之外,这种断言的目的是什么?它验证循环中的逻辑是正确的,所以我会这么说,尽管逻辑很简单。
return _repository.GetAll().Where(_ => _.UserId == userId).SingleOrDefault();

I have mocked it doing the following 

MockUserRepository.Setup(_ => _.GetAll()).Returns(Users.AsQueryable());
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; }
    }