如何在dotnetcore xunit测试中设置文化

bra*_*ing 7 c# cultureinfo xunit .net-core

我有以下单元测试,我从.Net Framework库移植到.Net核心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"   );
}
Run Code Online (Sandbox Code Playgroud)

但是测试无法在dotnet核心中编译.

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

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

Aar*_*rts 5

我查看了一些dotnet 源代码,我发现了这一点.

CultureInfo.DefaultThreadCurrentCulture = ci;
Run Code Online (Sandbox Code Playgroud)

基本上看起来你可以从静态属性CultureInfo而不是从静态属性设置默认线程当前文化Thread.CurrentThread

我发现了这个问题

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是在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));
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

单元测试项目的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>
Run Code Online (Sandbox Code Playgroud)

  • 这只适用于新线程而不是当前线程. (2认同)