I am creating a C# web API 2.0. along with a Test project. The API works fine. When I run the test project and hover over the contentResult
, which is the value returned from the API, it has the correct value. However, all the Assert statements fail. In the code below I am returning an object, DeliveryCode
. Even when I return string, I get the same error.
The controller:
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);
}
}
}
Concrete class 1:
public class GenerateFromExistingCode : IGenerateFromExistingCode
{
public string GetDeliveryCode()
{
return "XYZ456";
}
}
Concrete class 2:
public class GenerateBrandNewCode : IGenerateBrandNewCode
{
public string GetDeliveryCode()
{
return "ABC123";
}
}
Test
[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);
}
Errors:
ContentNegotiator -
'((System.Web.Http.Results.OkNegotiatedContentResult)actionResult).ContentNegotiator' threw an exception of type 'System.InvalidOperationException' Formatters: '((System.Web.Http.Results.OkNegotiatedContentResult)actionResult).Formatters' threw an exception of type 'System.InvalidOperationException' Request: '((System.Web.Http.Results.OkNegotiatedContentResult)actionResult).Request' threw an exception of type 'System.InvalidOperationException'