【问题标题】:Unable to validate the return value from web api 2.0无法验证来自 web api 2.0 的返回值
【发布时间】:2019-06-01 17:40:20
【问题描述】:

我正在创建一个 C# Web API 2.0。以及一个测试项目。 API 工作正常。当我运行测试项目并将鼠标悬停在 API 返回的值 contentResult 上时,它具有正确的值。但是,所有的 Assert 语句都失败了。在下面的代码中,我返回了一个对象DeliveryCode。即使我返回字符串,我也会得到同样的错误。

控制器:

public class CodeGeneratorController : ApiController
{
    ICheckCodeExist _checkCodeExist;
    IGenerateBrandNewCode _generateBrandNewCode;
    IGenerateFromExistingCode _generateFromExistingCode;
    IDeliveryCode _deliveryCode;

    public CodeGeneratorController(ICheckCodeExist checkCodeExist, IGenerateBrandNewCode generateBrandNewCode, IGenerateFromExistingCode generateFromExistingCode, IDeliveryCode deliveryCode)
    {
        _checkCodeExist = checkCodeExist;
        _generateBrandNewCode = generateBrandNewCode;
        _generateFromExistingCode = generateFromExistingCode;
        _deliveryCode = deliveryCode;
    }

    [HttpGet]
    [Route("api/CodeGenerator/{percentage}")]
    public IHttpActionResult Get(int percentage)
    {
        if (_checkCodeExist.IsCodeAvailable(percentage))
        {
            _deliveryCode.Code = _generateFromExistingCode.GetDeliveryCode();                   
            return Ok(_deliveryCode);
        }
        else
        {
            _deliveryCode.Code = _generateBrandNewCode.GetDeliveryCode();
            return Ok(_deliveryCode);
        }            
    }
}

具体类 1:

public class GenerateFromExistingCode : IGenerateFromExistingCode
{
    public string GetDeliveryCode()
    {
        return "XYZ456";
    }
}

混凝土类 2:

public class GenerateBrandNewCode : IGenerateBrandNewCode
{
    public string GetDeliveryCode()
    {
        return "ABC123";
    }
}

测试

[TestMethod]
public void GetDeliveryCodeWithPercentage()
{
    //Arrange
    Mock<ICheckCodeExist> checkCodeExist = new Mock<ICheckCodeExist>();
    checkCodeExist.Setup(x => x.IsCodeAvailable(50)).Returns(true);             
    var generateBrandNewCode = new GenerateBrandNewCode();
    var generateFromExistingCode = new GenerateFromExistingCode();
    var deliveryCode = new DeliveryCodeValue();

    var codeGeneratorController = new 
    CodeGeneratorController(checkCodeExist.Object, generateBrandNewCode, 
    generateFromExistingCode, deliveryCode);

    //Act
    IHttpActionResult actionResult = codeGeneratorController.Get(50);            
    var contentResult = actionResult as OkNegotiatedContentResult<DeliveryCodeValue>;

    //Assert
    Assert.IsNotNull(contentResult);
    Assert.IsNotNull(contentResult.Content);
    Assert.AreEqual("XYC456", contentResult.Content.Code);
}

错误:

ContentNegotiator -
'((System.Web.Http.Results.OkNegotiatedContentResult)actionResult).ContentNegotiator' 引发了“System.InvalidOperationException”类型的异常 格式化程序:'((System.Web.Http.Results.OkNegotiatedContentResult)actionResult).Formatters' 引发了“System.InvalidOperationException”类型的异常 请求:'((System.Web.Http.Results.OkNegotiatedContentResult)actionResult).Request' 抛出“System.InvalidOperationException”类型的异常

【问题讨论】:

标签: c# unit-testing asp.net-web-api moq


【解决方案1】:

您在测试中转换为错误的类型。

在被测系统中你返回

return Ok(_deliveryCode);

_deliveryCode 在哪里

IDeliveryCode _deliveryCode;

因此返回类型将是

OkNegotiatedContentResult<IDeliveryCode> //Interface

在测试中,您尝试将其转换为

OkNegotiatedContentResult<DeliveryCodeValue> //Concrete implementation

这会导致

var contentResult = actionResult as OkNegotiatedContentResult<DeliveryCodeValue>;

为空

把代码改成

var contentResult = actionResult as OkNegotiatedContentResult<IDeliveryCode>;

它应该按预期运行。

最后,GenerateFromExistingCode.GetDeliveryCode 返回"XYZ456",但断言正在检查"XYC456"

Assert.AreEqual("XYC456", contentResult.Content.Code);

验证这确实是所需的断言。

【讨论】:

  • 您好 NKosi,我已将代码更改为 var contentResult = actionResult as OkNegotiatedContentResult;仍然 contentResult 为空。它应该是“XYZ456”。我已经修好了。
  • @Massey 我看错了代码,复制了错误的界面。检查更新的答案。
  • 您好 NKosi,我已将控制器代码更改为,返回 Created("", _couponCode);和测试代码 var contentResult = actionResult as CreatedNegotiatedContentResult;现在一切正常
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 2019-08-28
  • 1970-01-01
相关资源
最近更新 更多