2017-12-28 9 views
1

클래스의 모의 객체 두 개를 만들려고하지만 같은 어셈블리 인 "FullName"을 가진 두 개의 모의 객체를 만듭니다.Rhino.Mocks : 다른 어셈블리 전체 이름을 사용하여 클래스의 스텁을 만드는 방법

public class MyClassA : SomeAbstractClass, ISomeInterface1, ISomeInterface2 
{ 
    public MyClassA(string someData) : base(someData) 
    { 
     //this property defined in base class 
     CheckId = GetType().FullName; 
    } 

    internal override string CheckId { get; } 
} 

public class TestClass 
{ 
    [Test] 
    public void TestMethod() 
    { 
     var stub1 = new MockRepository().StrictMock<MyClassA>("some data 1"); 
     var stub2 = new MockRepository().StrictMock<MyClassA>("some data 2"); 

     Assert.AreEqual(stub1.CheckId, stub2.CheckId); 
    } 
} 

위의 주장은 사실이며 거짓이라고 예상합니다.

CheckId를 제공하는 다른 인터페이스를 만들 수 있지만 프로덕션 코드와 동일한 환경을 만들고 싶습니다.

그래서 내 질문은 CheckId 속성이 다른 경우에도 rhino mock이 다른 개체에 대해 동일한 클래스 이름을 생성하는 이유입니다.

테스트 논리를 변경하지 않고 동일한 클래스의 다른 모의 인스턴스를 만들 수있는 다른 방법이 있습니까?

다른 세부 정보가 필요하면 알려 주시기 바랍니다. 미리 감사드립니다.

UPDATE :

해결하고자 내가 수동으로 속성을 업데이트하는 것보다 더 나은 솔루션을 발견했다. 제네릭 유형의 MyClassA를 만들면 문제가 해결됩니다. 아래에서 볼 수 있듯이;

public class MyClassA<TDummy> : SomeAbstractClass, ISomeInterface1, ISomeInterface2 
{ 
    public MyClassA(string someData) : base(someData) 
    { 
     //this property defined in base class 
     CheckId = GetType().FullName; 
    } 

    internal override string CheckId { get; } 
} 

public class TestClass 
{ 
    [Test] 
    public void TestMethod() 
    { 
     var mock1 = MockRepository.GenerateMock<MyClassA<int>>("some data 1"); 
     var mock2 = MockRepository.GenerateMock<MyClassA<bool>>("some data 2"); 

     Assert.AreEqual(stub1.CheckId, stub2.CheckId); 
    } 
} 

더미 유형이 다르기 때문에 생성 된 각각의 모의는 동일한 기본 유형의 다른 인스턴스입니다. 그리고 내가 예상 한대로 모든 단언은 거짓이다.

+0

이것은 반성 오해입니다. 단언은 옳다. 반영 될 때 생성 된 두 클래스는 동일한 유형을 제공합니다. – Nkosi

+0

제 목표는 다른 checkid (클래스 fullname 참조)를 사용하여 두 개의 모의 인스턴스를 만드는 것입니다. 그러나 백그라운드 모의 (mock) 로직에서 이해하는 것처럼, 리플렉션 중에 동일한 유형의 동일한 클래스 이름을 생성합니다. –

답변

0

하나의 옵션은 클래스를 조롱 할 때 반사 경우

public class TestClass { 
    [Test] 
    public void TestMethod() { 
     var stub1 = new MockRepository().StrictMock<MyClassA>("some data 1", "checkId 1"); 
     var stub2 = new MockRepository().StrictMock<MyClassA>("some data 2", "checkId 2"); 

     Assert.AreEqual(stub1.CheckId, stub2.CheckId); //Should fail. 
    } 
} 

그렇지 않으면 그 속성을 설정 제어 할 수는

public class MyClassA : SomeAbstractClass, ISomeInterface1, ISomeInterface2 { 
    public MyClassA(string someData, string checkId) : base(someData) { 
     //this property defined in base class 
     CheckId = checkId; 
    } 

    internal override string CheckId { get; } 
} 

그런 식으로 고유 할 수 있도록 수동으로 속성을 설정하는 것입니다 사용하려면 여러 클래스를 만드는 것이 좋을 것입니다.

public class MyClassA : SomeAbstractClass, ISomeInterface1, ISomeInterface2 { 
    //... 
} 

public class MyClassB : SomeAbstractClass, ISomeInterface1, ISomeInterface2 { 
    //... 
} 

public class TestClass { 
    [Test] 
    public void TestMethod() { 
     var stub1 = new MockRepository().StrictMock<MyClassA>("some data 1"); 
     var stub2 = new MockRepository().StrictMock<MyClassB>("some data 2"); 

     Assert.AreEqual(stub1.CheckId, stub2.CheckId); 
    } 
} 
+1

이것은 내 마음에 온 첫 번째 해결책이었습니다. 그러나 같은 클래스의 다른 가짜를 만들 수 있는지 확실하지 않았기 때문에 요청했습니다. 인터넷에서 나는 만족스러운 대답을 찾을 수 없었다. 어쨌든 피드백에 감사드립니다. 분명히 수동으로 속성을 설정하는 것보다 다른 기회는 없습니다. –