【发布时间】: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”类型的异常
【问题讨论】:
-
在将 'actionResult' 装箱到 'OkNegotiatedContentResult' 之前,调试并检查 'actionResult' 的真实类型是什么。
标签: c# unit-testing asp.net-web-api moq