我如何按照与测试项目不同的项目中存在的方法在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,或者在我的情况下返回测试。
答案 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