我应该对一个类进行单元测试以获取 MEF 属性吗?

发布于 2024-09-13 10:30:15 字数 85 浏览 5 评论 0原文

我想重构一个 DLL 以使其也可 MEFable。我是否应该对类是否用 [Export] 或 [Import] 以及其他 MEF 属性进行修饰进行单元测试?

I want to refactor a DLL to make it MEFable too. Should I unit test whether a class is decorated with [Export] or [Import] and other MEF attributes?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

爱本泡沫多脆弱 2024-09-20 10:30:15

您的测试应该更多地关注目标而不是机制。创建测试来验证诸如“如果我将类型 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 容器。我们称之为“组合测试”。

Your tests should focus more on the goal instead of the mechanism. Create tests that verify things like "if I throw types X, Y and Z together in a container, then I can pull an IFoo interface from the container", like this:

[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>();
    }
}

This is no longer a real "unit" test because it involves multiple classes and an IoC container. We just call them "composition tests".

凤舞天涯 2024-09-20 10:30:15

经过几个小时的思考并再次阅读一些 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.");
    }
}

对于其他 MEF 属性,例如 [ImportingConstructor] 或 [PartCreationPolicy],我以相同的方式进行操作。

After thinking some hours and reading some TDD blogs again I should say, YES, I have to test whether my class has MEF attributes or not.

So before refactoring my classes I write unit tests in that way:

[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.");
    }
}

For other MEF attributes like [ImportingConstructor] or [PartCreationPolicy] I do it the same way.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文