C# 使用新对象初始化插入/更新Moq

C# 使用新对象初始化插入/更新Moq,c#,unit-testing,mocking,nunit,moq,C#,Unit Testing,Mocking,Nunit,Moq,当调试单元测试用例时,id为0,但当它是正确的调用时,它返回正确的主键,即1、2、3等 Mock public class UserService { IUserRepo userRepo; UserService(IUserRepo repo) { userRepo = repo; } void AddUser(JsonData data) { User user = new User() {

当调试单元测试用例时,
id
为0,但当它是正确的调用时,它返回正确的主键,即1、2、3等

Mock

public class UserService
{
    IUserRepo userRepo;

    UserService(IUserRepo repo)
    {
        userRepo = repo;
    }

    void AddUser(JsonData data)
    {
        User user = new User()
        {
            Name = data.name,
            Number = data.Number
        };

        userRepo.Insert(user);

        int id = user.id;
    }
}
类测试用例
{
Mock mockUserRepo=new Mock();
[测试]
公共void test1()
{
//安排
JsonData obj=新JsonData()
{
Name=“Jane”,
Number=“0563722992”
}
用户dumpUser=新用户()
{
Name=“Def”,
Number=“8111”
};
mockUserRepo
.Setup(x=>x.Insert(It.IsAny()))
.Callback(()=>dumpUser.Id=1);
//表演
UserService u=新的UserService(mockUserRepo.Object);
u、 AddUser(obj);
//断言
}
}
在调试单元测试时,当回调通过方法
Insert()
时,它似乎无法将
id
更改为1

有人能帮助解决这个问题吗?

没有必要

class TestCases
{
    Mock<IUserRepo> mockUserRepo = new Mock<IUserRepo>();

    [Test]      
    public void test1()
    {
        //Arrange
        JsonData obj = new JsonData()
        {
            Name = "Jane",
            Number = "0563722992"
        }

        User dumpUser= new User()
        {
            Name = "Def",
            Number = "8111"
        };

        mockUserRepo
            .Setup(x => x.Insert(It.IsAny<User>()))
            .Callback(() => dumpUser.Id = 1);

        //Act
        UserService u = new UserService(mockUserRepo.Object);
        u.AddUser(obj);

        //Assert
    }
}
当被测试的方法在中创建/初始化它自己的实例时

捕获回调中传递的参数,并在那里更新所需的成员

User dumpUser= new User()
{
    Name = "Def",
    Number = "8111"
};
/。。。
用户报告
.Setup(x=>x.Insert(It.IsAny()))
.Callback((用户参数)=>arg.Id=1);
//...

您正在更改“dumpUser”的id,而不是在您的服务中创建的用户。
//...

userRepo
    .Setup(x => x.Insert(It.IsAny<User>()))
    .Callback((User arg) => arg.Id = 1);

//...