3

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

我在我们的一个项目中的“共享” 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”(起初我不确定单元测试项目是否需要它,但我也将它添加到徒劳无功)。

我认为这应该可以解决问题,我在这里遗漏了什么吗?

4

1 回答 1

1

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

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

关于这个问题的更多讨论可以在 这里找到

于 2013-04-11T19:24:44.167 回答