C# 测试不';除非我对方法';返回值

C# 测试不';除非我对方法';返回值,c#,asp.net-mvc,unit-testing,nunit,C#,Asp.net Mvc,Unit Testing,Nunit,好的,我有一个奇怪的问题 我在一个C#Test项目中使用NUnit和Moq。我认为您可以忽略模拟对象,因为真正的问题在于UserManager.AddUser()没有正确执行 以下代码永远不会到达UserManager.AddUser()开头的断点,因此会由于NullPointerException而导致断言失败 [测试] 在这里输入代码 public void AddUser_NoPassword_GeneratesPassword()的 { //断言 var userRepositoryFa

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

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

以下代码永远不会到达UserManager.AddUser()开头的断点,因此会由于NullPointerException而导致断言失败

[测试]
在这里输入代码
public void AddUser_NoPassword_GeneratesPassword()的
{
//断言
var userRepositoryFake=new Mock();
userRepositoryFake.Setup(x=>x.GetUser(It.IsAny(),It.IsAny())。返回((User)null);
userRepositoryFake.Setup(x=>x.SaveUser(It.IsAny())。返回(new Mock().Object);
var userManager=newusermanager(userRepositoryStub.Object);
var createUserViewModel=new createUserViewModel{Username=“Username”};
//表演
var validationErrors=userManager.AddUser(createUserViewModel);
//断言
IsNotNullOrEmpty(createUserViewModel.Password);
}
但是,如果我添加此断言:

//断言
Assert.IsEmpty(validationErrors)//新主张
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
}
public IEnumerable AddUser(模型)
{
//做点什么
如果(foo)
{
收益率。。。;
}
如果(巴)
{
收益率。。。;
} 
//更多的东西
}
换句话说,使用迭代器块。迭代器块是延迟执行的——代码仅在请求第一个元素时开始执行,甚至在返回该元素时它也会“暂停”


考虑到这不是一个幂等查询或类似的查询,我建议在内部使用
列表
实现该方法会更有意义,您可以添加到该列表,然后在最后返回。这样,无论返回值被迭代多少次,该方法都将执行一次。我怀疑这就是预期的执行模式。

你能将代码发布到AddUser吗?@user1770699:AddUser的返回值是多少?如果它是IEnumerable,那么它被列举了吗?非常感谢,我学到了一些关于收益率的新知识。