web-dev-qa-db-ja.com

IActionResult型で結果が返されたときにXunitでコンテンツ値を取得する方法

Xunitを使用した単体テストプロジェクトがあり、テストするメソッドはIActionResultを返します。

「NegotiatedContentResult」を使用してIActionResultのコンテンツを取得することを提案する人もいますが、それはXunitでは機能しません。

だから私はXunitでIActionResultのコンテンツ値を取得する方法を疑問に思う?

テストコードの例を以下に示します。

public void GetTest()
{
    var getTest = new ResourcesController(mockDb);

    var result = getTest.Get("1");

    //Here I want to convert the result to my model called Resource and
    //compare the attribute Description like below.
    Resource r = ?? //to get the content value of the IActionResult

    Assert.Equal("test", r.Description);
}

XUnitでこれを行う方法を知っている人はいますか?

18
Julie C.

返されるものに依存します。前の例では、このようなアクションを使用しました。

_[HttpGet("{id}")]
public IActionResult Get(string id) {        
    var r = unitOfWork.Resources.Get(id);

    unitOfWork.Complete();

    Models.Resource result = ConvertResourceFromCoreToApi(r);

    if (result == null) {
        return NotFound();
    } else {
        return Ok(result);
    }        
}
_

そのメソッドは、OkObjectResultまたはNotFoundResultを返します。テスト対象のメソッドがOk()を返すことを期待している場合は、テストの結果を期待するものにキャストし、そのアサーションを行う必要があります

_public void GetTest_Given_Id_Should_Return_OkObjectResult_With_Resource() {
    //Arrange
    var expected = "test";
    var controller = new ResourcesController(mockDb);

    //Act
    var actionResult = controller.Get("1");

    //Assert
    var okObjectResult = actionResult as OkObjectResult;
    Assert.NotNull(okObjectResult);

    var model = okObjectResult.Value as Models.Resource;
    Assert.NotNull(model);

    var actual = model.Description;
    Assert.Equal(expected, actual);
}
_
25
Nkosi