我是否应该对具有MEF属性的类进行单元测试?

时间:2010-08-10 07:05:01

标签: unit-testing tdd mef

我想重构一个DLL以使其成为MEFable。我应该单元测试是否用[导出]或[导入]和其他MEF属性修饰了一个类吗?

2 个答案:

答案 0 :(得分:3)

您的测试应该更多地关注目标而不是机制。创建测试来验证诸如“如果我将X,Y和Z类型放在一个容器中,然后我可以从容器中拉出一个IFoo接口”的测试,如下所示:

[Test]
public void Can_get_IFoo_from_container_with_Foo_Bar_Baz()
{
    var catalog = new TypeCatalog(typeof(Foo), typeof(Bar), typeof(Baz));
    using (var container = new CompositionContainer(catalog))
    {
        var test = container.GetExportedValue<IFoo>();
    }
}

这不再是真正的“单元”测试,因为它涉及多个类和IoC容器。我们只称它们为“构图测试”。

答案 1 :(得分:1)

在思考了几个小时并再次阅读一些TDD博客后,我应该说,是的,我必须测试我的班级是否具有MEF属性。

因此,在重构我的类之前,我会以这种方式编写单元测试:

[TestClass]
public class When_SampleClass_mefable
{
   [TestMethod]
   [TestCategory("LFF.Kabu.Win.Login.ViewModel.SampleClass")]
   public void Should_SampleClass_be_marked_with_Export_Attibute()
   {
       //arrange
       var info = (typeof (SampleClass));

       //act
       var attr = info.GetCustomAttributes(true);

       var hasExportAttribute = 
           attr.Where(x => x.GetType() == typeof (ExportAttribute))
               .Where(x => ((ExportAttribute)x).ContractType == typeof(SampleClass))
               .Count() > 0;
       //assert
       Assert.IsTrue(hasExportAttribute, "SampleClass is not marked with Export.");
    }
}

对于[ImportingConstructor]或[PartCreationPolicy]等其他MEF属性,我也是这样做的。