【问题标题】:How to set the culture in a dotnetcore xunit test如何在 dotnetcore xunit 测试中设置文化
【发布时间】:2017-09-13 13:16:36
【问题描述】:

我将以下单元测试从 .Net Framework 库移植到 .Net core xunint 测试库。需要添加单元测试的项目是

https://github.com/dotliquid/dotliquid

并被添加到所选文件中,如下所示

我要添加的单元测试是

[Test]
public void ParsingWithCommaDecimalSeparatorShouldWork()
{
    var ci = new CultureInfo(CultureInfo.CurrentCulture.Name)
             {
                 NumberFormat =
                 {
                     NumberDecimalSeparator = ","
                     , NumberGroupSeparator = "."
                 }
             };
    Thread.CurrentThread.CurrentCulture = ci;

    var t = Template.Parse("{{2.5}}");
    var result = t.Render( new Hash(), CultureInfo.InvariantCulture );
    Assert.AreEqual( result, "2.5"   );
}

但是测试无法在 dotnet core 中编译。

严重性代码描述项目文件行抑制状态 错误 CS1061“线程”不包含定义 'CurrentCulture' 并且没有扩展方法 'CurrentCulture' 接受 可以找到“线程”类型的第一个参数(您是否缺少 使用指令或程序集 参考?)DotLiquid.Tests(net451) C:\Users\phelan\workspace\dotliquid\src\DotLiquid.Tests\OutputTests.cs 113 N/A

我需要针对不同的文化进行不同的单元测试。我想创建一个 XUnit 理论,其中每个实例都以不同的文化传递,以供单元测试验证。这是如何在 .NetCore 中完成的?

【问题讨论】:

    标签: c# .net-core cultureinfo xunit


    【解决方案1】:

    我查看了一些 dotnet source 并找到了这个。

    CultureInfo.DefaultThreadCurrentCulture = ci;
    

    基本上,您似乎可以从CultureInfo 的静态属性而不是Thread.CurrentThread 设置默认线程当前文化

    我找到了this

    public CultureInfo CurrentCulture
    {
        get
        {
            Contract.Ensures(Contract.Result<CultureInfo>() != null);
            return CultureInfo.CurrentCulture;
        }
    
        set
        {
            Contract.EndContractBlock();
    
            // If you add more pre-conditions to this method, check to see if you also need to 
            // add them to CultureInfo.DefaultThreadCurrentCulture.set.
    
            if (m_CurrentCulture == null && m_CurrentUICulture == null)
                nativeInitCultureAccessors();
    
            CultureInfo.CurrentCulture = value;
        }
    }
    

    这是Thread.cs。因此,您可以显式设置CultureInfo.CurrentCulture 属性。

    示例:

    CultureInfo.CurrentCulture = new CultureInfo("en-GB"); ;
    
    Assert.Equal("£1,000.00", String.Format("{0:C}", 1000));
    
    CultureInfo.CurrentCulture = new CultureInfo("en-US"); ;
    
    Assert.Equal("$1,000.00", String.Format("{0:C}", 1000));
    

    单元测试项目的csproj文件:

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <TargetFramework>netcoreapp1.0</TargetFramework>
    
        <IsPackable>false</IsPackable>
    
        <ApplicationIcon />
    
        <OutputType>Library</OutputType>
    
        <StartupObject />
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0-preview-20170425-07" />
        <PackageReference Include="xunit" Version="2.2.0" />
        <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
      </ItemGroup>
    
    </Project>
    

    【讨论】:

    • 但我可以在测试用例中启动新线程,因此即使不是完全正确的答案,提示也值得 +1。
    • 运行时失败 ;)
    • 我正在使用 Core 2.0 运行 VS 2017,并且测试通过了(在 core 1.1 中也通过了)
    • 嗯。让我检查一下。沙盒目前一团糟。我确信我在尝试时遇到了某种异常。
    • 不,我只是在使用 dotnet core app 1.0(可能是 2.0)时出现构建失败,这已得到改进?? dl.dropboxusercontent.com/s/ahljp4bqjig3zkl/…
    【解决方案2】:

    解决办法是设置

    CultureInfo.DefaultThreadCurrentCulture = ci;
    

    然后然后启动一个新线程。这将为下一个线程设置当前区域性。最终的测试用例是。

    [Test]
    public void ParsingWithCommaDecimalSeparatorShouldWork()
    {
        var ci = new CultureInfo(CultureInfo.CurrentCulture.Name)
                 {
                     NumberFormat =
                     {
                         NumberDecimalSeparator = ","
                         , NumberGroupSeparator = "."
                     }
                 };
    
        CultureInfo.DefaultThreadCurrentCulture = ci;
        var result = "";
        var thread = new Thread
            ( delegate()
            {
                Console.WriteLine(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);
                Console.WriteLine(CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator);
    
                var t = Template.Parse("{{2.5}}");
                result = t.Render(new Hash(), CultureInfo.InvariantCulture);
            } );
        thread.Start();
        thread.Join();
        Assert.AreEqual(result, "2.5");
    
    }
    

    这有点乱,但完成工作。

    【讨论】:

      猜你喜欢
      • 2017-10-04
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多