코드 계약을 사용하여 인터페이스에 대해 쓴 (아주 간단한) 계약이 적용되도록 노력하고 있습니다.인터페이스 계약이 어셈블리 외부에 적용되지 않는 이유는 무엇입니까?
이 코드는 우리 프로젝트 중 하나의 "공유"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과 테스트 DLL 모두 .net4.0 프레임 워크를 대상으로합니다.
코드 계약은 "표준 계약 요구 사항", 전체 런타임 검사 및 두 프로젝트의 계약 참조 어셈블리에 대한 'DoNotBuild'로 설정됩니다 (처음에는 단위 테스트 프로젝트에 필요하지는 않았지만, 거기에 아무 소용이 너무).
게이트에서 문제가 없다고 생각했는데 여기에 뭔가 빠졌습니까?