如何在XUnit复杂方法中进行测试

时间:2019-01-21 10:39:36

标签: c# asp.net-core xunit

我如何按照与测试项目不同的项目中存在的方法在asp.net core 2.0中进行测试?例如这样的

 public partial class LoanRequestServiceController : BaseServiceController
 {
    public ServiceDTO<AP_CBO> AddCBO(AP_CBO cbo)
    {
        ServiceDTO<AP_CBO> dto = new ServiceDTO<AP_CBO>();

        try
        {
            using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.Snapshot }))
            {
                cbo.ID_CBO = 333;
                dto.Data = cbo;
                scope.Complete();
            }
        }
        catch (Exception ex)
        {
            dto.Error = new ServiceError(ex);
            Globals.Logger.Error(ex);
        }
        finally
        {
            //Globals.CastleComponentsContainer.Release(LoanRequestDAL);
        }
        return dto;
    }
 }

我测试了一些“轻便”的方法,例如服务方法是否返回SucessCode并且它可以工作。 这是我的测试课:

    [Theory]
    [InlineData("/Sample/AddCBO")]
    public async Task Test_AddCBO(string url)
    {
        //Arrange
        var client = _factory.CreateClient();

        //Act
        var response = await client.GetAsync(url);

        //Assert

        response.EnsureSuccessStatusCode();
        //Compare two dto objects AP_CBO
        //object expected = new AP_CBO { properties... }
        // object responseObject = response.Content...
        //Assert.Equal(expected, responseObject);
    }

我不知道如何测试具有多属性的对象。 也许我需要使用Moq?从理论上讲,此方法将转到DAL(数据库访问层),然后从数据库打包的对象返回并返回到api,或者在我的情况下返回测试。

2 个答案:

答案 0 :(得分:2)

首先,您必须确定要编写的测试级别。

如果您正在编写单元测试,则应模拟所有外部集成(在您的情况下,我可以识别 HTTP请求->控制器控制器->数据库)。这是功能测试的基础。因此,如果要编写单元测试,可以,应该使用诸如NSubstitute或Moq之类的模拟框架(并且只能通过调用方法来测试方法的行为)。

您发布的测试样本在我看来像是集成测试,因为您包括了集成 HTTP请求->控制器。在这种情况下,我将为数据库填充数据(如果相关),然后实际调用您的API端点(就像您已经在做的那样)。

要检查ASP.Net Core中响应的内容(DTO),您必须执行以下操作:

// ...
var response = await client.GetAsync(url);

response.EnsureSuccessStatusCode();

var content = await httpResponseMessage.Content.ReadAsStringAsync();
var serviceDto = JsonConvert.DeserializeObject<ServiceDTO<AP_CBO>>(content); // Only for Json
// Validate serviceDto

答案 1 :(得分:0)

这里是一个很长的话题,需要详细解释;我认为如果您按照示例阅读详细信息会更好。

我假设您要编写单元测试;对于单元测试,我可以推荐可以帮助您的本教程。 check this please