使用ThreadStatic(单元测试)
本文关键字:单元测试 ThreadStatic 使用 | 更新日期: 2023-09-27 17:49:28
为了单元测试的目的,我写了下面的代码来存根Singleton。
public static class LocalisationSetter
{
[ThreadStatic]
private static CultureInfo _cultureInfo;
public static void Set(CultureInfo cultureInfo)
{
_cultureInfo = cultureInfo;
Localisation.Current.Culture = _cultureInfo; // Setting The singleton.
}
}
在我的测试中,我做了如下的事情:
LocalisationSetter.Set(new CultureInfo("fr-FR"));
上面的方法看起来有点"脏"…
只是想知道是否有更好的方法。我需要确保对"本地化"的更改仅对线程可见。
拥有一个"Setter"类是一种相当奇特的模式。正如DStanley所评论的那样,如果不使Localization.Current
线程静态,上述内容也不会像预期的那样工作:
public class Localization{
[ThreadStatic]
private static Localization _current;
public static Current {
get { _current = _current ?? new Localization(); return _current }
set { _current = value; }
}
}
也就是说,这通常是一个非常特殊的模式,因为这有效地创建了"全局"变量,这通常使单元测试和软件维护更加复杂。
(上面的代码创建了可以随时更改的短暂状态,从而影响代码的行为)。
考虑使用依赖注入,或者至少将这些"全局"变量组织到几个聚合对象中,以便您确实拥有这些上下文对象的事实更容易跟踪。