【问题标题】:Issue with Moq Assert for Generic Type通用类型的起订量断言问题
【发布时间】:2021-10-09 04:56:06
【问题描述】:

我是 Moq 的新手。

如何断言泛型类型?

测试的这一行出现类型错误 Assert.True(ServiceResponse<string>.Equals(result)); 有错误

无法在静态上下文中访问非静态方法“Equal”

完整代码如下

控制器

private readonly IAuthRepository _authRepo;
public AuthController(IAuthRepository authRepo)
{
    _authRepo = authRepo;
}

[HttpPost("Register")]
public async Task<ActionResult<ServiceResponse<int>>> Register(AddUserDtos user)
{
    var response = await _authRepo.Register(user);
    if (!response.Success)
    {
        return BadRequest(response);
    }
    return Ok(response);
}        

服务响应

public class ServiceResponse<T>
{
    public T Data { get; set; }

    public bool Success { get; set; } = true;

    public string Message { get; set; } = null;
}    

测试

public class UnitTest1
{
    public Mock<IAuthRepository> repositoryStub = new Mock<IAuthRepository>();

    [Fact] 
    public async Task UnitOfWork_StateUnderTest_ExpectedBehaviour()
    {
        // Arrange
        repositoryStub.Setup(repo =>
                repo.Register(It.IsAny<AddUserDtos>()))
            .ReturnsAsync((ServiceResponse<string>) null); 

        var controller = new AuthController(repositoryStub.Object);

        AddUserDtos newUser = new AddUserDtosModel()
            {Company = "Test", Email = "email", FirstName = "", LastName = "", Password = "344343", Phone = "test"};
        // Act
        var result = await controller.Register(newUser);

        // Assert
        Assert.True(ServiceResponse<string>.Equals(result));
    }
}

【问题讨论】:

  • 首先尝试创建一个您期望收到的 ServiceResponse 实例,然后检查收到的结果。 ServiceResponse&lt;int&gt; response = new ServiceResponse&lt;int&gt;() { // fill in the properties that you want to check }; Assert.True(response.Equals(result));

标签: c# .net-core moq


【解决方案1】:

首先,让我们修改安排阶段。 与其将null 转换为ServiceResponse&lt;int&gt;,不如创建一个新实例:

// Arrange
ServiceResponse<int> response = new ServiceResponse<int>();
repositoryStub
    .Setup(repo =>repo.Register(It.IsAny<AddUserDtos>()))
    .ReturnsAsync(response); 

那么你有几个选项来确保返回的对象具有特定的类型。

作为运算符和空值检查

您可以简单地尝试将返回的值转换为特定类型,然后检查是否成功:

var okResult = result as OkObjectResult;
Assert.NotNull(okResult);

var resultValue = okResult.Value as ServiceResponse<int>; 
Assert.NotNull(resultValue);

IsAssignableFrom

您只需使用正确的T 调用IsAssignableFrom&lt;T&gt;

var okResult = Assert.IsAssignableFrom<OkObjectResult>result;
_ = Assert.IsAssignableFrom<ServiceResponse<int>>(okResult.Value); 

GetType 和GetGenericTypeDefinition

如果需要分别检查容器类和泛型类型
那么你也可以这样做:

var okResult = ...;
var resultValue = okResult.Value;

Assert.NotNull(resultValue);
Assert.Equal(typeof(ServiceResponse<>), resultValue.GetType().GetGenericTypeDefinition());
Assert.IsType<int>(resultValue.Data);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2012-03-17
    • 2011-10-17
    相关资源
    最近更新 更多