【问题标题】:Moq Insert/Update with new Object initializationMoq 插入/更新新对象初始化
【发布时间】:2019-10-02 12:31:47
【问题描述】:
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;
    }
}

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

模拟

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
    }
}

在调试单元测试时,似乎回调在通过方法Insert() 时无法将id 更改为1。

谁能帮忙解决这个问题?

【问题讨论】:

  • 您正在更改 'dumpUser' 的 id,而不是在您的服务中创建的用户。

标签: c# unit-testing mocking nunit moq


【解决方案1】:

不需要

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

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

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

//...

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

//...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2023-04-07
    • 2016-01-06
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    相关资源
    最近更新 更多