2017-09-13 26 views
5

Tôi có bài kiểm tra đơn vị sau đây mà tôi đang chuyển từ thư viện .Net Framework sang thư viện kiểm tra xunint lõi .Net. Các dự án thử nghiệm đơn vị cần phải được thêm vào làCách đặt văn hóa trong thử nghiệm xénit dotnetcore

https://github.com/dotliquid/dotliquid

và đang được thêm vào tập tin được lựa chọn như hiển thị ở đây

enter image description here

các thử nghiệm đơn vị tôi đang cố gắng để thêm là

[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" ); 
} 

Tuy nhiên, thử nghiệm không thể biên dịch trong lõi dotnet.

Mức độ nghiêm trọng Mã hàng Mô tả dự án Tập Dòng Suppression Nhà nước Lỗi CS1061 'Chủ đề' không chứa một định nghĩa cho 'CurrentCulture' và không có phương pháp mở rộng 'CurrentCulture' chấp nhận một đối số đầu tiên của loại 'Chủ đề' có thể được tìm thấy (? là bạn thiếu một sử dụng chỉ thị hoặc tham khảo một hội ) DotLiquid.Tests (net451) C: \ Users \ phelan \ workspace \ dotliquid \ src \ DotLiquid.Tests \ OutputTests.cs 113 N/A

Tôi cần phải có các bài kiểm tra đơn vị khác nhau với các nền văn hóa khác nhau. Tôi muốn tạo ra một lý thuyết XUnit trong đó mỗi cá thể đi qua một nền văn hóa khác nhau để kiểm thử đơn vị để xác minh. Làm thế nào được thực hiện trong. NetCore?

Trả lời

5

Tôi đã xem một số dấu chấm câu source và tôi đã tìm thấy điều này.

CultureInfo.DefaultThreadCurrentCulture = ci; 

Về cơ bản có vẻ như bạn có thể thiết lập mặc định là thread văn hóa hiện tại từ một tài sản tĩnh của CultureInfo hơn là từ Thread.CurrentThread

chọc xung quanh một chút tôi càng thấy 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; 
    } 
} 

Đây là trong Thread.cs. Vì vậy, bạn có thể đặt thuộc tính CultureInfo.CurrentCulture một cách rõ ràng.

dụ:

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 tập tin cho dự án đơn vị kiểm tra:

<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> 
+2

Điều đó chỉ hoạt động đối với các chủ đề mới chứ không phải chủ đề hiện tại. – bradgonesurfing

+0

nhưng tôi * có thể * xoay các chủ đề mới trong trường hợp thử nghiệm để mẹo có giá trị +1 ngay cả khi đó không phải là câu trả lời đúng. – bradgonesurfing

+0

@bradgonesurfing xem câu trả lời cập nhật –

0

Giải pháp là để thiết lập

CultureInfo.DefaultThreadCurrentCulture = ci; 

rồi quay lên một chuỗi mới. Điều này sẽ thiết lập văn hóa hiện tại cho chuỗi tiếp theo. Trường hợp thử nghiệm cuối cùng là.

[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"); 

} 

hơi lộn xộn nhưng hoàn thành công việc.

Các vấn đề liên quan