因此,我正在使用FakeItEasy为我的ASP.NET Web Api应用程序编写xUnit测试. 下面是我的测试,它应该返回一个MemberDto对象列表;

       public async Task UsersController_GetUsers_ReturnsOK()
        {
            //Arrange

            //var users = A.Fake<IEnumerable<MemberDto>>();
            //A.CallTo(() => _userRepository.GetMembersAsync(A<string>.That.Matches(email => true))).Returns(users);

            //Act
            var result = await _controller.GetUsers();

            //Assert
            result.Should().NotBeNull();
            result.Should().BeOfType<ActionResult<IEnumerable<MemberDto>>>();
            result.Result.Should().BeOfType<OkObjectResult>();
        }
}

GetUser方法在控制器中的实现:

{
    public async Task<ActionResult<IEnumerable<MemberDto>>> GetUsers()
    {   
        var currentUser = await _userRepository.GetUserByEmailAsync(_userExtensions.GetEmail(User));
        users = await _userRepository.GetMembersAsync(currentUser.Email);

        return Ok(users);
    }
}

正如您所看到的,我已经注释掉了xUnit测试中的代码行,其中它模拟了_userRepository中的GetMembersAsync方法,但无论如何它都会伪造数据(用户不是空的,它的类型将是伪造的System.Collection...)

就是这样,有人能给我解释一下吗?这是我第一次编写单元测试,我一直在YouTube上看到一个叫Teddy Smith的人在那里解释如何编写单元测试.我从他的GitHub下载了他的示例课程,并用嘲弄的方式注释掉了这行,它确实通过了测试,无论这行有没有,什么都没有改变.谢谢

推荐答案

FakeItEasy附带了一组默认行为,开发人员认为这些行为很有用.因此,默认情况下,具有返回值的成员将返回一些内容(具体地说,是一个"哑元",即相关类型的非空对象).

IEnumerable的情况下,哑元将是一个看起来像枚举数的东西,其成员本身返回更多的哑元.在本例中,它将返回一个伪枚举数,其MoveNext返回一个伪布尔值(即false,因此GetMembersAsync返回看起来像空可枚举数的值.

你可以在Default fake behavior → Overrideable members are faked岁时阅读更多.

Csharp相关问答推荐

如何解决提交按钮后 Select 选项错误空参照异常

Blazorise折线图仅绘制数据集的一部分

如何在WPF的树视图中显示一个对象的两个或多个属性,其中只有一个是分层项?

为什么无法将对象转换为泛型类型

TeamsBot SendActivityActivityTypes与ActivityTypes同步.键入不再起作用

如何使用自定义负载均衡器管理Ocelot负载均衡器中的多线程和批读取

在IAsyncEnumerable上先调用,然后跳过(1)可以吗?

有没有更好的方法来在CosmosDB上插入非id?

如何更改新创建的实例的变量?

具有类型识别的泛型方法

序列化过程中的死循环

我应该为C#12中的主构造函数参数创建私有属性吗?

C#如何替换两个XML元素值?

GMap.NET中的暗模式映射

如何在.NET Core控制台应用程序中从appsettings获取配置

奇怪的字符串.StartsWith和.包含从.NET Framework 4.8升级到.NET 6后的行为

C#Razor语法

我应该在调用外部资源的嵌套方法上​​同时实施重试策略和断路器吗?

返回 C# 元组时参数数量错误或属性分配无效 (VB6)?

在整个代码库中用 C# 别名类型替换 CLR 类型