为什么接口合同不适用于汇编之外?

时间:2013-04-09 18:11:51

标签: .net unit-testing generics visual-studio-2012 code-contracts

我很难确保使用代码合约为接口编写的(非常简单的)合同正在应用。

我在其中一个项目的“共享”dll中有此代码。目的是我们的几个模块可以使用相同的基础架构并实现自己的处理程序和命令类型:

[ContractClass(typeof(CommandHandlerContracts<>))]
public interface ICommandHandler<TCommand>
    where TCommand : ICommand
{
    void Handle(TCommand _command);
}

[ContractClassFor(typeof(ICommandHandler<>))]
public class CommandHandlerContracts<TCommand> : ICommandHandler<TCommand>
    where TCommand : ICommand
{
    public void Handle(TCommand _command)
    {
        Contract.Requires<ArgumentNullException>(_command != null);
    }
}

如果我然后运行这样的简单测试,则失败,因为没有抛出异常:

public class TestCommand : ICommand
{
    public string Field { get; set; }
}

public class TestHandler : ICommandHandler<TestCommand>
{
    public void Handle(TestCommand _command) { }
}

[TestClass]
public class UnitTest1
{
    [TestMethod]
    [ExpectedException(typeof (ArgumentNullException))]
    public void TestMethod1()
    {
        new TestHandler().Handle(null);
    }
}

只要将其他dll中的接口和契约类定义复制/粘贴到测试类上,一切都会开始工作。接口与实现接口的dll不同,似乎存在一个问题。

我目前正在使用Visual Studio 2012和Microsoft测试类('Microsoft.VisualStudio.QualityTools.UnitTestFramework')进行单元测试。应用程序和测试dll都针对.net4.0框架。

代码合同设置为“标准合同要求”,完整运行时检查和两个项目的合同参考组件的“DoNotBuild”(起初我不确定单元测试项目是否需要这个,但我添加了它那里也无济于事。)

我认为这应该可以解决问题,我在这里错过了一些东西吗?

1 个答案:

答案 0 :(得分:1)

我对Code Contracts如何实际生成合同条款有错误的想法。事实证明,它需要为所有引用的程序集构建合同引用程序集,以确保运行时检查(在我的项目中将其设置为“DoNotBuild”)。

将“common”项目设置为“Build”后,测试项目能够创建自己的合同,并且异常开始抛出。

可以找到关于此问题的更多讨论 here