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과 테스트 DLL 모두 .net4.0 프레임 워크를 대상으로합니다.

코드 계약은 "표준 계약 요구 사항", 전체 런타임 검사 및 두 프로젝트의 계약 참조 어셈블리에 대한 'DoNotBuild'로 설정됩니다 (처음에는 단위 테스트 프로젝트에 필요하지는 않았지만, 거기에 아무 소용이 너무).

게이트에서 문제가 없다고 생각했는데 여기에 뭔가 빠졌습니까?

답변

1

코드 계약이 실제로 계약 조항을 생성하는 방법에 대해 잘못된 생각을 가졌습니다. 런타임 참조를 보장하기 위해 모든 참조 된 어셈블리에 대해 계약 참조 어셈블리를 빌드해야합니다 (프로젝트에서 "DoNotBuild"로 설정 됨).

'공통'프로젝트를 "빌드"로 설정하면 테스트 프로젝트에서 자체 계약을 생성 할 수 있었고 예외가 발생하기 시작했습니다.

이 문제에 대한 자세한 내용은 here

입니다.