2017-09-13 4 views
5

J'ai le test unitaire suivant que je porte d'une bibliothèque .Net Framework à la bibliothèque de test xNet de base .Net. Le projet, le test unitaire doit être ajouté à estComment définir la culture dans un test xunit dotnetcore

https://github.com/dotliquid/dotliquid

et est ajouté au fichier sélectionné comme indiqué ici

enter image description here

Le test unitaire, je suis en train d'ajouter est Cependant, le test échoue à compiler dans le cœur dotnet.

Code de gravité Description du projet État Suppression de la ligne de fichier Erreur CS1061 fil de discussion ne contient pas une définition pour « CurrentCulture » et aucune méthode d'extension « CurrentCulture » accepter un premier argument de type « fil » pourrait être trouvé (? Il vous manque un en utilisant la directive ou une référence Assemblée ) DotLiquid.Tests (net451) C: \ Users \ Phelan \ workspace \ dotliquid \ src \ DotLiquid.Tests \ OutputTests.cs 113 N/a

J'ai besoin de différents tests unitaires avec différentes cultures. Je voudrais créer une théorie XUnit où chaque instance passe dans une culture différente pour le test unitaire à vérifier. Comment cela se fait-il dans .NetCore?

Répondre

5

J'ai regardé certains des dotnet source et je l'ai trouvé.

CultureInfo.DefaultThreadCurrentCulture = ci; 

Fondamentalement, il semble que vous pouvez définir la valeur par défaut enfilez culture actuelle d'une propriété statique de CultureInfo plutôt que de Thread.CurrentThread

farfouillé un peu plus j'ai trouvé 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; 
    } 
} 

C'est au Thread.cs. Vous pouvez donc définir explicitement la propriété CultureInfo.CurrentCulture.

exemple:

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

fichier csproj pour le projet de test unitaire:

<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

Cela ne fonctionne que pour les nouveaux threads qui ne sont pas en cours. – bradgonesurfing

+0

mais je * peux * lancer de nouveaux threads dans le cas de test de sorte que la pointe vaut +1, même si ce n'est pas exactement la bonne réponse. – bradgonesurfing

+0

@bradgonesurfing voir la mise à jour –

0

La solution est de mettre

CultureInfo.DefaultThreadCurrentCulture = ci; 

et puis lancer un nouveau fil. Cela définira la culture actuelle pour le prochain thread. Le cas de test final est.

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

} 

ce qui est un peu brouillon, mais faire le travail.