【问题标题】:Activate Unit Test in Development and Test Phase and not Production phase在开发和测试阶段而不是生产阶段激活单元测试
【发布时间】:2021-04-05 04:16:35
【问题描述】:

目标:
单元测试方法TestMethod1只能用于开发和测试阶段。 如果在生产阶段使用,一切都会被取消或类似的。

问题:
当我尝试从 useEnvironment() 方法中删除字符串值“Development”时,代码仍然有效。

是否可以在开发和测试阶段而不是在生产阶段激活单元测试?

信息:
*源码取自https://www.meziantou.net/testing-an-asp-net-core-application-using-testserver.htm
*请考虑到您可能有大约 500 个单元测试。
*使用asp.net core mvc v3

谢谢!


------

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.TestHost;
using System;
using System.Collections.Generic;
using System.Text;
using Xunit;
using System.Net.Http;
using System.Threading.Tasks;
using Testtest;

namespace XUnitTestProject1.Test
{
    /// <summary>
    /// https://www.meziantou.net/testing-an-asp-net-core-application-using-testserver.htm
    /// </summary>
    public class Tests
    {
        [Fact]
        public async Task TestMethod1()
        {
            var webHostBuilder =
                  new WebHostBuilder()
                        .UseEnvironment("Development") // You can set the environment you want (development, staging, production)
                        .UseStartup<Startup>(); // Startup class of your web app project

            using (var server = new TestServer(webHostBuilder))
            using (var client = server.CreateClient())
            {
                string result = await client.GetStringAsync("/api/values");
                Assert.Equal("[\"value1\",\"value2\"]", result);
            }
        }
    }
}

using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Testtest.Controllers
{
    /// <summary>
    /// ValuesController
    /// </summary>
    [ApiController]
    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
    }
}


更新:

[CustomTestsFact]
[Fact]
public async Task TestMethod2()
{
    using (var client = _server.CreateClient())
    {
        string result = await client.GetStringAsync("/api/values");
        Assert.Equal("[\"value1\",\"value2\"]", result);
    }
}

【问题讨论】:

    标签: c# unit-testing asp.net-core-mvc asp.net-core-3.1


    【解决方案1】:

    XUnit FactAttribute 具有 Skip 属性,可用于跳过方法。

    您可以创建一个从 FactAttribute 派生的自定义类,并使用您的 env 变量来控制是否应该跳过该方法:

        public class CustomFactAttribute : FactAttribute
          {
        public CustomTestsFactAttribute()
        {
            var phaseVariable = Environment.GetEnvironmentVariable("name of your env variable");
            
            Skip = phaseVariable == "production"
                ? "Tests ignored"
                : base.Skip;
        }
    }
    

    然后你可以用 CustomFactAttribute 标记你的方法:

       [CustomTestsFact]
        public async Task TestMethod1()
        {
           //your logic
        }
    

    【讨论】:

    • 我尝试了您的解决方案,但它不起作用
    • 你能显示代码吗,你的意思是它不起作用,你尝试调试解决方案吗?
    • @What'sUP 你不能编译来自@Buhhovsky 的解决方案。它与不起作用不同。原因很明显-您的测试项目中没有CustomTestsFactAttribute(根据您显示的错误)。您是否忘记复制粘贴 CustomTestsFactAttribute 类定义?另请注意,此解决方案取决于环境变量,因此您不能只是复制粘贴,您必须在 GetEnvironmentVariable 调用中使用变量名称(并在执行测试之前设置此变量值)
    猜你喜欢
    • 2011-09-12
    • 1970-01-01
    • 2020-11-15
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    相关资源
    最近更新 更多