Невозможно проверить возвращаемое значение из веб-API 2.0 - PullRequest
0 голосов
/ 07 января 2019

Я создаю C # web API 2.0. вместе с тестовым проектом. API работает нормально. Когда я запускаю тестовый проект и наведите курсор мыши на contentResult, которое является значением, возвращаемым из API, оно имеет правильное значение. Однако все утверждения 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";
    }
}

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);
}

Ошибка:

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'

1 Ответ

0 голосов
/ 07 января 2019

Вы применяете неверный тип в тесте.

В тестируемой системе вы возвращаете

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);

Убедитесь, что это действительно желаемое утверждение.

...