gpt4 book ai didi

c# - 除非我断言方法的返回值,否则测试不会执行方法

转载 作者:行者123 更新时间:2023-12-02 05:06:23 24 4
gpt4 key购买 nike

好的,我有一个奇怪的问题。

我在 C# 测试项目中使用 NUnit 和 Moq。我认为您可以忽略 Mock 对象,因为真正的问题在于 UserManager.AddUser() 没有被正确执行。

以下代码永远不会到达 UserManager.AddUser() 开始处的断点,因此将因 NullPointerException 而在断言上失败。

[Test]
enter code here
public void AddUser_NoPassword_GeneratesPassword()
{
//assert
var userRepositoryFake = new Mock<IUserRepository>();
userRepositoryFake.Setup(x => x.GetUser(It.IsAny<string>(), It.IsAny<bool>())).Returns((User)null);
userRepositoryFake.Setup(x => x.SaveUser(It.IsAny<User>())).Returns(new Mock<User>().Object);

var userManager = new UserManager(userRepositoryStub.Object);
var createUserViewModel = new CreateUserViewModel { Username = "username" };

//act
var validationErrors = userManager.AddUser(createUserViewModel);

//assert
Assert.IsNotNullOrEmpty(createUserViewModel.Password);
}

但是,如果我添加这个断言:

        //assert
Assert.IsEmpty(validationErrors); //new assertion
Assert.IsNotNullOrEmpty(createUserViewModel.Password);

到达AddUser()中的断点,测试成功。似乎测试根本不执行 AddUser(),除非它的返回值用于某些事情。

最佳答案

我的猜测是 AddUser是这样实现的:

public IEnumerable<Error> AddUser(Model model)
{
// Do some stuff
if (foo)
{
yield return ...;
}
if (bar)
{
yield return ...;
}
// More stuff
}

换句话说,使用迭代器 block 。迭代器 block 延迟执行 - 代码仅在请求第一个元素时才开始执行,即便如此,它也会在返回该元素时“暂停”。

鉴于这不是一个幂等查询或类似的查询,我建议使用 List<Error> 来实现该方法更有意义。在内部添加,然后在最后返回。这样,该方法将恰好执行一次,但返回值会被迭代多次。我怀疑这是预期的执行模型。

关于c# - 除非我断言方法的返回值,否则测试不会执行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16239653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com