簡體   English   中英

Api控制器的單元測試

[英]Unit test for Api controller

我嘗試為Api控制器編寫單元測試。 這是一個C#mvc應用程序。 Moq也可以使用單元測試。

這是控制器:

public sealed class CaseController : ApiControllerBase
{    
    [HttpGet]
    [Route("{id:int}")]
    public ICaseDto<object> Get(int id)
    {
        return _caseProcess.GetCase(id);
    }
}

這是接口:

public interface ICaseProcess
{
    ICaseDto<object> GetCase(int id);
}

這是方法:

internal sealed class CaseProcess : ProcessBase, ICaseProcess
{
    public ICaseDto<object> GetCase(int id)
    {
        var caseEntity = GetCaseById(id);

        CaseProcessHelper helper = GetHelper(caseEntity);
        object details = helper.GetReferenceDetails();

        ICaseDto<object> resultDto = CaseDto.Create(details);
        Mapper.Map(caseEntity, resultDto);
        return resultDto;
    }
}

我嘗試這樣編寫單元測試:

[TestMethod]
public void CaseConroller_ReturnDetailData_Test()
{
    //Arrange
    var dto = new Case();
    var mockService = new Mock<ICaseProcess>();
    var Casecontroller = new CaseController(ICaseDto<Case>);
    var expected = new CaseEditDto();
    //var dataSource = new

    CaseProcess.Setup(a => a.Should(dto))

    //Act

    // var result = "hallo";

    //Assert
    result.Should().BeEquivalentTo();
}

那么,您必須如何精確地編寫單元測試?

我有一個Detail視圖,然后Api必須返回細節視圖的數據。

id是一個int,例如: api/support/cases/100000002

構造函數如下所示:

 public CaseController(ICaseProcess caseProcess)
        {
            _caseProcess = caseProcess;
        }

我現在有這樣的東西:

 //Arrange
            var dto = new Case();
            var mockService = new Mock<ICaseProcess>();
            var casecontroller = new CaseController(CaseProcess.Object);
            var expected = new CaseEditDto();

            //Act

             var result = casecontroller.Get(100000001);

            //Assert
            result.Should().BeEquivalentTo(expected);

但是輸出是這樣的:

{
    "details": {
        "name": "Val van Urquhart",
        "dateOfBirth": "11 september 1933"
    },
    "dateSubmittedFormatted": "1 januari 2018",
    "dateClosedFormatted": null,
    "sample": false,
    "comments": [
        {
            "id": 1,
            "account": "todo@local.nl",
            "date": "08-11-2018 17:13",
            "text": "ABC"
        }
    ],
    "id": 100000001,
    "status": 103,
    "substatus": null,
    "verdict": null,
    "owner": 101,
    "dateSubmitted": "01-01-2018",
    "dateClosed": null,
    "type": 100,
    "reference": "123459850"
}

我這樣嘗試:

 [TestMethod]
        public void CaseController_GetCase_Test()
        {
            var CaseObject = new CaseDto<object>()
            {
                Id = 100000001,
                Verdict = null,                
                DateSubmitted = "01-01-2018",
                DateClosed = null,
                Reference = "123459850"

            };        




            var CaseTest = new CaseEditDto<object>();
            // Case entity =   UnitOfWork.GetRepository<Case>()

        }

根據顯示的代碼段,假設控制器看起來像

public sealed class CaseController : ApiControllerBase {
    private readonly ICaseProcess caseProcess;

    public CaseController(ICaseProcess caseProcess) {
        this.caseProcess = caseProcess;
    }

    [HttpGet]
    [Route("{id:int}")]
    public ICaseDto<object> Get(int id) {
        return caseProcess.GetCase(id);
    }
}

一個非常簡單的測試是模擬依賴項,將其注入到測試對象中,進行測試,然后斷言預期的行為

[TestMethod]
public void CaseConroller_ReturnDetailData_Test() {
    //Arrange
    //mock the dependency
    var id = 100000001;
    var expected = Mock.Of<ICaseDto<object>>();
    var mockService = new Mock<ICaseProcess>();
    mockService.Setup(_ => _.GetCase(id)).Returns(expected);
    //inject it into the subject under test
    var subject = new CaseController(mockService.Object);

    //Act
    var actual = subject.Get(id); //exercise the test

    //Assert
    //assert the expected behavior
    actual.Should().BeEquivalentTo(expected);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM