首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >没有代码覆盖率的HttpParameterBinding

没有代码覆盖率的HttpParameterBinding
EN

Stack Overflow用户
提问于 2019-06-06 23:38:13
回答 1查看 64关注 0票数 0

OpenCover On Cake脚本未检测到将HttpPArameterBiding应用于某些ApiController操作参数的Owin.Testing使用覆盖率。

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

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

代码语言:javascript
运行
复制
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测试:

代码语言:javascript
运行
复制
[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属性。

代码语言:javascript
运行
复制
   [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;
    }

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-11 21:07:36

我找出了问题所在,它与asp.net框架HttpParameterBinding组件无关。

而不是像这样执行代码封面:

代码语言:javascript
运行
复制
 OpenCover(context => context.DotNetCoreTest(file.FullPath, dotNetTestSettings), new FilePath($"CoverageResults.xml"), openCoverSettings);

我将其更改为:

代码语言:javascript
运行
复制
    OpenCover(tool => {
        tool.XUnit2($"{testsPath}/**/**/**/**/{projectName}.dll",xUnit2Settings);
        }, new FilePath("./OpenCoverCoverageResults.xml"),openCoverSettings);

此外,构建必须在调试模式下进行配置,以便OpenCover可以使用pdbs。

我唯一不喜欢的是dlls的路径是显式的层数,我也不想复制dlls,因为这会花费更多的时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56480923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档