我想重构一个DLL以使其成为MEFable。我应该单元测试是否用[导出]或[导入]和其他MEF属性修饰了一个类吗?
答案 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属性,我也是这样做的。