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

标签 c# .net-core cultureinfo xunit

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

https://github.com/dotliquid/dotliquid

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

enter image description here

我要添加的单元测试是

[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 核心中编译。

Severity Code Description Project File Line Suppression State Error CS1061 'Thread' does not contain a definition for 'CurrentCulture' and no extension method 'CurrentCulture' accepting a first argument of type 'Thread' could be found (are you missing a using directive or an assembly reference?) DotLiquid.Tests(net451) C:\Users\phelan\workspace\dotliquid\src\DotLiquid.Tests\OutputTests.cs 113 N/A

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

最佳答案

我看了一些 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));

enter image description here

单元测试项目的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>

关于c# - 如何在 dotnetcore xunit 测试中设置文化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46198655/

相关文章:

c# - 如何使具有相同数据的对象具有相同的键?

javascript - 在 ASP.NET MVC5 中向表单动态添加控件

.net - 如何从使用 EPPlus.core 创建的 Excel MemoryStream 生成 PDF?

c# - 这安全吗,还是只能在英语国家使用?

c# - c#中的UDP抓包

c# - "first time"a DbContext 到底是什么时候访问数据库的?

c# - 搜索 .NET Core 或标准 NuGet 包

asp.net-core - 如何制作 .NET Core 类库并从 .NET 4.6 项目中引用它?

asp.net - 设置 session 文化

c# - 如何在 C# 中枚举本地化字母表?