2011-07-28 4 views
15

단위 테스트를위한 조롱 프레임 워크로 Rhino Mock을 사용하고 있습니다.Rhino 모의를 사용하여 내부 유형에 대한 모의 수업을 만들 수 없습니다.

나는 테스트하고 싶은 클래스 인 Subject라는 클래스를 가지고 있습니다. 그것은 IStore에 의존합니다.

//internal interface : has InternalsVisible to both "Subject" 
//and "StoreTests" class namespaces 
internal interface IStore { 
    void Store(string name); 
    //other methods 
} 

다음과 같이 제목 클래스가 정의되어 다음과 같이

ISTORE 정의된다

class Subject : IStore { 
    private IStore internalStore; 

    //constructor injection 
    void Subject(IStore store) { 
     internalStore = store; 
    } 

    void Store(string name) { 
     internalStore.Store(name); 
    } 

    //other methods 
} 

다음과 같이 RhinoMocks를 사용하여 내 테스트 클래스는 다음과 같습니다

//test class 
class StoreTests { 
    Subject subject = new Subject(); 

    [Test] 
    public StoreTest() { 
     //Arrange 
     var mockStore = MockRepository.GenerateMock<IStore>(); 
     string testName = "test"; 
     mockStore.Expect(x => x.Store(testName)).Returns(null); 

     //Act 
     subject.Store(testName); 

     //Assert 
     mockStore.VerifyAllExpectations(); 
    } 

    //other test methods 
} 

에서 내 설정, 인터페이스가 내부로 정의되어 있고 InternalsVisible이 Subject 클래스와 Sto 모두에 대해 설정되어 있습니다. reTests 클래스. 그러나 테스트 케이스가 실행될 때, var에 예외를 던진다. mockStore = MockRepository.GenerateMock(); IStore가 public이 아니므로 Mock을 생성 할 수 없다고 말합니다.

IStore가 공개되지 않았기 때문에 이것이라고 생각합니다. 그러나 IStore dll에 InternalsVisibleTo를 설정 했으므로 StoreTests가 해당 클래스의 모의 객체를 만들지는 충분하지 않습니까?

이제이 문제는 IStore 인터페이스를 공용으로 만들어 해결할 수 있다고 생각합니다. 그러나 이것이 나를위한 선택 사항이 아니라면 IStore를위한 모의를 만들 수있는 다른 방법이 있습니까? 는 테스트중인 의 AssemblyInfo.cs에 다음과 같은 어셈블리의 파일을 추가하기에 충분해야한다 네

답변

27

당신이 코뿔소가 조롱에 조립 내부를 볼 만드는 시도 했습니까?

[assembly: InternalsVisibleTo ("DynamicProxyGenAssembly2")] 

자세한 내용은 Rhino Mocks Internal Members을 참조하십시오.

클래스가 조롱 될 때 조롱 된 클래스에서 파생 된 런타임에 새 클래스가 생성됩니다. 이 생성 된 클래스는 "DynamicProxyGenAssembly2"라는 별도의 "임시"어셈블리에 있습니다. 따라서 내부 어셈블리에 대한 액세스를 허용하려면 대상 어셈블리에 InternalsVisibleTo 특성을 설정해야합니다. 그렇지 않으면 모의 객체가 내부 멤버를 오버라이드 할 수 없으므로 (조롱 된 메소드가 가상으로 표시되어야하는 이유이기도 함). 단원 테스트와 테스트 된 클래스가 동일한 어셈블리에 있어도 마찬가지입니다.

그래서, 당신은 대상 클래스 '어셈블리 (예를 AssemblyInfo.cs에) 같은 프록시 어셈블리 볼의 내부를 만드는 있는지 확인해야합니다

+1

링크 주셔서 감사합니다! 이제 작동합니다. – Santhosh

10

:

[assembly: InternalsVisibleTo("Tests.Assembly.Name")] 
[assembly: InternalsVisibleTo("NUnit.Framework")] 
[assembly: InternalsVisibleTo("Rhino.Mocks, PublicKey=00240000048000009400000006020000002400005253413100040000010001009D1CF4B75B7218B141AC64C15450141B1E5F41F6A302AC717AB9761FA6AE2C3EE0C354C22D0A60AC59DE41FA285D572E7CF33C320AA7FF877E2B7DA1792FCC6AA4EB0B4D8294A2F74CB14D03FB9B091F751D6DC49E626D74601692C99EAB7718ED76A40C36D39AF842BE378B677E6E4EAE973F643D7065241AD86ECC156D81AB")] 
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] 
+0

이 답변은 정당합니다. 위키에 추가 정보에 대한 링크를 제공하기 때문에 다른 하나를 승인 된 것으로 표시합니다. – Santhosh

3

음이 대답 할 수 있지만에 대한 나는 그것이 작동하지 않았다.

그래서 여기에 내가했던 일이 있습니다. (다른 사람들에게 도움이 될 수도 있고, 다음 프로젝트에서도 도움이 될 수도 있습니다 ....) :

Visual Studio에서 도구 메뉴에서

: 외부 도구 : 내가 "LongStrongName"를 넣어 이름을 추가,하지만 당신은 맞는 느낌이 무엇 이건을 넣을 다음 Sn.exe를가 어디에 있든

(이 경로를, 또는 당신은) :

:
Command: 
    C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\sn.exe 
Arguments: 
    -Tp $(TargetPath) 

(출력

이제 다음 도구로 이동하여 "LongStrongName"메뉴로 이동하여 프로젝트를 클릭 할 수 있습니다) "출력 창 사용"확인란을 클릭 (내가 여러 어셈블리를 넣어했다)

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] 

는 당신이 필요로하는 어떤 어셈블리 추가하고 짜잔 :

Public key is  0240000048000009400000006020000002400005253413100040000010001009badbe86c32ec0 
ec429f0b3909********* 

Public key token is 6ccc051******** 

열고 assembly.cs 파일을 추가 :

및 VS 출력을 것이다.

관련 문제