2013-06-29 13 views
1

Moq가 스텁 인스턴스 인 Moq.Object.GetType()을 통해 해당 유형을 전달할 때 Activator.CreateInstance를 통해 동적으로 생성하려는 데이터 클래스를 스텁하기 위해 Moq를 사용하려고합니다. System.MissingMethodException {"No parameterless constructor defined for this object."}"이 개체에 대해 정의 된 매개 변수없는 생성자가 없습니다."형식에서 인스턴스를 만들려면 moq를 가져올 수 없습니다.

내가 뭘 잘못하고 있니? Moq를 수용하기 위해 주제 코드를 변경하고 싶지 않습니다.

테스트

private Test() ... 
{ 
    var recordStub = new Mock<IRecord>(); 
    var record = recordStub.Object; 
    var recordDefinition = new RecordDefinition() 
           { MappedRecordClassType = record.GetType(), ... 

    var newRecord = CreateDataRecord(recordDefinition); 
    ... 
} 

당신은 record.GetType()과에 IRecord를 구현하는 동적 런타임에 MOQ에 의해 생성 된 객체입니다 record = recordStub.Object 이후 인스턴스를 생성하는

private IRecord CreateDataRecord(RecordDefinition recordDefinition) 
{ 
    var result = Activator.CreateInstance(recordDefinition.MappedRecordClassType) 
         as IRecord; 
    return result; 
} 
+0

'MappedRecordClassType'에 매개 변수가없는 기본 생성자가 있습니까? –

+0

MappedRecordClassType은 단순히 System.Type 유형의 매개 변수입니다. 이 유형의 데이터 클래스는 모의 된 것, 즉 새로운 Mock ()이므로 생성자는 Moq에서 추정 한 것으로 생성됩니다. – SuperC0der

답변

2

주제 귀하의 상황을 누른 다음 본질적으로 뭐하는거야 동적 생성 OB의 인스턴스를 만드는 것입니다 ject 그리고 그것은 Activator.CreateInstance() 그 유형에 인수를 취하지 않는 공공 생성자를 찾을 수 없습니다 보인다. 지금 나는 왜 당신이하고있는 일을하고 있는지 모르지만 모의를 사용하는 사람은 본 적이 없기 때문에 시험을 재고해야한다고 생각합니다.

1

코드에서 어딘가에서 Moq이 조롱하지 않았거나 클래스로 직접 노출 된 객체를 인스턴스화하려고합니다. 어느 쪽의 방법이라도 객체에는 0 개의 파라미터를 가지는 public 생성자가 없다.

테스트에서 public 0 매개 변수 생성자가없는 객체가 호출되는 위치를 추적하여 해결하거나 그렇지 않으면이를 해결해야합니다.

나는 최근 프로젝트에서 똑같은 것을 보았고, 대부분의 경우 인터페이스 대신 클래스 자체로서 객체를 떠오 랐습니다.

+0

저는 구체적인 클래스를 조롱했고 클래스가 Moq를 인스턴스화 할 때 클래스가 기대하는 인수를 전달하지 않았을 때이 메시지를 받았지만이 경우 스텁은 동적 클래스 인 Moq가 생성하는 인터페이스를 기대합니다 매개 변수가없는 생성자가 있습니다 (즉, Object에서 파생 됨). – SuperC0der

0

나는 Sniffer에 동의합니다. 당신이하고있는 일은 typeof IRecord을 전달한 다음 Activator가 인스턴스를 생성하도록 요청하는 것입니다. 하지만 인터페이스이므로 직접 인스턴스를 만들 수는 없으므로 구체적인 순서가 필요합니다.

이 테스트에서 가치가 있다면, 오래된 학교의 수작업 스터브를 작성하면됩니다. 즉, 간단히 IRecord 인터페이스를 구현하고 값을 반환하는 거의 비어있는 클래스입니다 실제 작업 없음) 테스트가 필요합니다.

하지만 실제로는 Activator.CreateInstance이 해당 유형을 찾고 그 인스턴스를 만들 수 있다는 테스트이며, Sniffer에 동의합니다. 기본적으로 타사 코드를 테스트하고 있습니다. 당신은 아마이 방법을 다루지도 말아야하지 않을 것입니다.

+0

Moq (배경 뒤에서)가 실제로 IRecord 인터페이스를 구현하는 클래스를 만들고 있다고 생각했습니다. 따라서 GetType()은 나에게이 클래스의 Type을 제공해야한다.이 문제를 해결하기 위해 수동 스텁 (Stub)을 작성했지만 여기서 뭔가 문제가 있다고 생각하지만 Moq의 작동 방식과 이것이 좀 더 동적 인 코딩 구조에서 문제가 될 수 있는지 알아 내려고했습니다. – SuperC0der

+0

Moq는 해당 인터페이스를 구현하는 클래스의 인스턴스를 만들고 기본값은 느슨한 동작이므로 모의 인스턴스에서 무엇이든간에 충돌을 일으킬 가능성이 거의 없습니다. 그러나 IRecord 인터페이스 인 객체의 타입을'Activator.CreateInstance()'를 호출하는 메소드로 넘겨 주므로 실제로 코드는 * Activator, IRecord 타입의 인스턴스를 생성합니다 *. 이로 인해 인터페이스의 인스턴스를 만들 수 없으므로 런타임 오류가 발생합니다. Moq를 제거하고'typeof (IRecord)'를 전달하여 동일한 결과를 볼 수있다. – Damon