如何在特定的线程文化中执行MSpec规范?

Fab*_*ied 1 cultureinfo currentculture mspec

我有一些测试代码执行文化感知转换的规范.我想为我的测试设置一个定义的文化,这样我就可以对预期的值进行硬编码,而不必担心运行测试的系统的配置文化.

有没有一种简单的方法可以使用Machine.Specifications来执行此操作,还是必须设置Thread.CurrentThread.CurrentCulture(也可能CurrentUICulture)?

Ant*_*ean 6

MSpec没有任何用于更改Thread文化的内置工具.但是,它有几种在测试之前和之后做"某事"的一般方法.

"简单"的方法是只使用Establish和Cleanup代理.

[Subject("Culture Sensitive Tests")]
public class When_doing_culture_sensitive_stuff
{
    Establish context = () =>
    {
        OldCulture = Thread.CurrentThread.CurrentCulture;
        Thread.CurrentThread.CurrentCulture = NewCulture;
        Thread.CurrentThread.CurrentUICulture = NewCulture;
    }

    Cleanup cleanup = () => 
    {
        Thread.CurrentThread.CurrentCulture = OldCulture;
        Thread.CurrentThread.CurrentUICulture = OldCulture;
    }

    Because of = () => Subject.DoSomethingCultureSensitive();

    It should_do_something_culture_sensitive = () => ...;

    private static CultureInfo OldCulture;
    private static CultureInfo NewCulture;
}
Run Code Online (Sandbox Code Playgroud)

但是,您需要在每个需要它的测试中分享它.所以,我推荐一个帮助类进行切换.

public class ChangeCurrentCulture : IDisposable
{
    private readonly CultureInfo original;

    public ChangeCurrentCulture(CultureInfo culture)
    {
        original = Thread.CurrentThread.CurrentCulture;
        Change(culture)
    }

    private void Change(CultureInfo culture)
    {
        Thread.CurrentThread.CurrentCulture = culture;
        Thread.CurrentThread.CurrentUICulture = culture;
    }

    public void Dispose()
    {
        Change(original);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在共享基类中设置调用.代表在运行规范时会被链接.

public abstract class CultureSensitive
{
    Establish context = () =>
    {
        Change = new ChangeCurrentCulture(NewCulture);
    }

    Cleanup cleanup = () => 
    {
        Change.Dispose();
    }

    private static ChangeCurrentCulture Change;
    private static CultureInfo NewCulture;
}


[Subject("Culture Sensitive Tests")]
public class When_doing_culture_sensitive_stuff : CultureSensitive
{   
    Because of = () => Subject.DoSomethingCultureSensitive();

    It should_do_something_culture_sensitive = () => ...;
}
Run Code Online (Sandbox Code Playgroud)

另一个选项取决于您将所有培养敏感测试分成单独的组件.该IAssemblyContext界面为您提供了两种程序集范围的设置和清理方法.您可以更改该程序集中所有规范的文化(不要担心清理).

public class CultureSensitiveTests : IAssemblyContext
{
    public void OnAssemblyStart()
    {
        Thread.CurrentThread.CurrentCulture = NewCulture;
        Thread.CurrentThread.CurrentUICulture = NewCulture;
    }

    public void OnAssemblyComplete()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)