2010-06-30 5 views
1

저는 moq 및 유닛 테스트에 초보자입니다. 그래서 나는 그것을 철저히 이해하지 못합니다. 질문이 어리 석다면 용서해주십시오. 다음 시나리오를 이해하도록 도와주세요. ";"유닛 테스트 Throwing "System.NullReferenceException", Moq 및 Nunit 사용

다음은 내 간단한 테스트

[Test] 
public void TryMoq() { 
    var mock = new Mock<IDummyInterface>(); 
    var dummy = new DummyClass(mock.Object); 
    mock.VerifySet(m => m.Model = It.Is<DummyModel>(mo => mo.MyProperty == "foo")); 
} 

내가 라인 "i.Model.MyProperty ="foo는 지금에

public class DummyClass 
{ 
    public DummyClass(IDummyInterface i) { 
     i.Model = new DummyModel() ; 
     i.Model.MyProperty = "foo"; 

    } 
} 

public class DummyModel 
{ 
    public string MyProperty { get; set; } 
} 

public interface IDummyInterface { 
    DummyModel Model { get; set; } 
} 

을 테스트하기 위해 노력하고있어 코드입니다 "System.NullReferenceException"이 발생합니다.

왜 내가 Moq를 사용하는 이유부터 생각합니다.

"DummyClass"의 생성자를 변경하면 이상한 것이 있습니다. 이처럼

public DummyClass(IDummyInterface i) 
    { 
     i.Model = new DummyModel() { MyProperty ="foo"}; 
     //i.Model.MyProperty = "foo"; 

    } 

시험 패스. 두 번째 경우에도 "foo"의 값을 "bar"로 변경하려고합니다. 테스트가 실패합니다 (이것은 좋은 생각입니다).

나는 단지 무슨 일이 벌어지고 있는지 알고 싶다. 어떻게하면 moq를 사용해 자식 속성을 검증 할 수 있을까요? 해당 객체에 설정하는 것이 기억 모의 원인이됩니다

i.Model = new DummyModel(); 

: 당신이 그것을 말할하지 않는

답변

1

두 경우의 차이는 당신이 본질적으로

입니다
var dummyModel = new DummyModel() { MyProperty ="foo"}; 
i.Model = dummyModel; 

을 작성하는

i.Model = new DummyModel() { MyProperty ="foo"}; 

을 쓸 때, 당신은 당신의 인터페이스에 전달한다는 것입니다 프롭퍼티가 벌써 「Foo」로 설정되어있는 오브젝트 테스트에서는 "누군가 Mock의 속성을 DummyModel 유형의 개체로 설정하려고 시도합니다. MyProperty 속성이"Foo "로 설정되어있는 경우 정확히 어떤 일이 일어나고 있는지 테스트합니다.

첫 번째 경우는 다음 행이 실행 된 후 i.Model이 null이므로 실패합니다.

i.Model = new DummyModel(); 

얻기 또는 당신이 당신이 수행 할 작업을 지정하지 않는 한, 그것은 단지 아무것도 할 것이다 속성을 설정하거나 널 (null)을 반환하지 않습니다 직접 모의에 속성을 설정. 따라서이 경우 생성자의 두 번째 줄에서 i.Model이 null이므로 i.Model.MyProperty에 null 예외가 발생합니다.

+0

좋은 설명 주셔서 감사합니다. 당신의 대답과 함께. 내 문제를 해결하기 때문에 나는 "arneeiri"답장을 좋아했다. :) – Mohit

2

는 모의는 속성 값을 기억하지 않습니다. 그러나 속성에 액세스하면 여전히 null을 반환합니다. 당신이 자동 재산처럼 행동하려면, 사용

mock.SetupAllProperties(); 

지금

i.Model.MyProperty = "foo"; 

더 이상 실패하지 않습니다. mock을 사용하면 항상 모든 동작을 명시 적으로 지정해야합니다.

더 읽기에 : http://code.google.com/p/moq/wiki/QuickStart

+0

문제의 해결책은 "arneeiri"에 감사드립니다. 그러나, 나는 설명을 찾고 있었다. 하지만 SetupAllProperties가 해결해 주므로 고마워요. – Mohit

1

당신은 또한 같은 작업을 수행 할 수 있습니다

var mock = new Mock<IDummyInterface>(); 
mock.SetupSet(m => m.Model = It.Is<DummyModel>(mo => mo.MyProperty == "foo")).Verifiable(); 

var dummy = new DummyClass(mock.Object); 

mock.Verify(); 

m.Model의 MOQ의 기본 구현은 더미에게 기본 모의보다() 뭔가를 줄 필요 해요, 그래서 null을 반환하는 것입니다.