使用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"));

上面的方法看起来有点"脏"…

只是想知道是否有更好的方法。我需要确保对"本地化"的更改仅对线程可见。

使用ThreadStatic(单元测试)

拥有一个"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; }
   }
}

也就是说,这通常是一个非常特殊的模式,因为这有效地创建了"全局"变量,这通常使单元测试和软件维护更加复杂。

(上面的代码创建了可以随时更改的短暂状态,从而影响代码的行为)。

考虑使用依赖注入,或者至少将这些"全局"变量组织到几个聚合对象中,以便您确实拥有这些上下文对象的事实更容易跟踪。