gpt4 book ai didi

testing - 没有代码覆盖率的 HttpParameterBinding

转载 作者:行者123 更新时间:2023-11-28 21:37:43 26 4
gpt4 key购买 nike

OpenCover On Cake 脚本未检测到对我的 Owin 的覆盖。测试将 HttpPArameterBiding 应用于某些 ApiController 操作参数的用法。

我已经创建了一种新的 ApiController 类型,作为我称为 FromHeaderAttribute 的 ParameterBindingAttribute 的一个 Action 。之后,我创建了我的 Owin 测试服务器和相应的 HttpClient,并执行了请求和正确的断言以验证绑定(bind)是否正常工作。测试成功通过。

这是我的单元测试蛋糕任务

Task("UnitTests")
.IsDependentOn("Build")
.IsDependentOn("RestoreNugets")
.DoesForEach(GetFiles($"{testsPath}/**/*.csproj"), (file) =>
{
var openCoverSettings = new OpenCoverSettings
{
OldStyle = true,
MergeOutput = true,
Register = "user",
LogLevel = OpenCoverLogLevel.Verbose,
ArgumentCustomization = args => args.Append("-coverbytest:*.Tests.dll").Append("-mergebyhash")
}
.WithFilter("+[AppRootName.*]*");

var projectName = file.GetFilename().ToString().Replace(".csproj",string.Empty);

var dotNetTestSettings = new DotNetCoreTestSettings
{
Configuration = "Release",
DiagnosticOutput = true,
Verbosity = DotNetCoreVerbosity.Normal,
ArgumentCustomization = (args)=>
{
args.Append($"--logger \"trx;LogFileName={projectName}-TestsResults.trx\"");
args.Append("--filter \"TestCategory=Unit|Category=Unit\"");
return args;
}
};
OpenCover(context => context.DotNetCoreTest(file.FullPath, dotNetTestSettings), new FilePath($"CoverageResults.xml"), openCoverSettings);

})
.Finally(()=>
{
Information($"Copying test reports to ${outputDir}/TestsResults .... ");
CopyFiles($"{testsPath}/**/TestResults/*.trx",$"{outputDir}/TestsResults");
ReportGenerator($"*-CoverageResults.xml", $"{outputDir}/Reports");

});

这是我的 XUnit 测试:

[Fact]
[Trait("Category", "Unit")]
public async Task WhenHeadersArePresent_SettingsShouldBeSetted()
{
HttpConfiguration configuration = new HttpConfiguration();
var container = new SimpleInjector.Container();

Mock<IApiControllerValidation> mockValidationInterface = new Mock<IApiControllerValidation>();

ManualResetEvent resetEvent = new ManualResetEvent(false);
Settings settingsReceived = null;
mockValidationInterface.Setup((validator) => validator.Assert(It.IsAny<object>(), It.IsAny<object>(), It.IsAny<IDictionary<string, string>>(), It.IsAny<IHttpActionResult>()))
.Callback<object, object, IDictionary<string, string>, IHttpActionResult>((header, body, parameters, result) =>
{
settingsReceived = header as Settings;
resetEvent.Set();
});

container.RegisterInstance(mockValidationInterface.Object);

using (var server = TestServer.Create(app =>
{

configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
configuration.MapHttpAttributeRoutes();
app.Use((owinContext, nextHandler)=> nextHandler());
app.UseWebApi(configuration);

}))
{
var client = server.HttpClient;
client.DefaultRequestHeaders.Add("header1", new List<string>() { "headervalue1" } );
client.DefaultRequestHeaders.Add("header2", new List<string>() { "headervalue2" });
var result = await client.PostAsync<Payload>("optionalHeader", new Payload("value1"), new JsonMediaTypeFormatter());
Assert.Equal(HttpStatusCode.OK,result.StatusCode);
};

resetEvent.WaitOne();
Assert.NotNull(settingsReceived);
Assert.Equal("headervalue1", settingsReceived.Header1);
Assert.Equal("headervalue2", settingsReceived.Header2);

}

这是我的 Api 操作,我想测试我已实现的 FromHEader 属性。

   [HttpPost]
[Route("optionalHeader",Name = "PostValidation")]
public IHttpActionResult OptionalHeaders([FromHeader]Settings settings, [FromBody]Payload payload)
{
var result = Ok();
validation.Assert(settings,payload, null, result);
return result;
}

我希望测试的代码覆盖率检测到 This 类型的使用,但这不是因为报告显示我的类型的代码覆盖率为 0。

enter image description here

最佳答案

我弄清楚是什么问题了,它与任何与asp.net框架HttpParameterBinding组件相关的东西都没有关系。

而不是像这样执行代码覆盖:

 OpenCover(context => context.DotNetCoreTest(file.FullPath, dotNetTestSettings), new FilePath($"CoverageResults.xml"), openCoverSettings);

我把它改成了这样:

    OpenCover(tool => {
tool.XUnit2($"{testsPath}/**/**/**/**/{projectName}.dll",xUnit2Settings);
}, new FilePath("./OpenCoverCoverageResults.xml"),openCoverSettings);

此外,构建必须在 Debug模式下通过配置完成,这样 OpenCover 才能使用 pdb。

我仍然不喜欢的唯一一件事是 dll 的路径通过显式级别的数量来显式,我也不想复制 dll,因为这会花费更多时间。

关于testing - 没有代码覆盖率的 HttpParameterBinding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56480923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com