2011-10-01 6 views
0

저는 Moq 프레임 워크와 C#을 처음 접했습니다. 내 [설정] 함수에서 VS 2010 Express와 NUnit를C# 교육용 Moq가 스위트 룸의 첫 번째 테스트에서 작동하지 않습니다.

을 사용하고, 내가 가진 : 그 후 각 시험은 빈 목록을 가져옵니다 동안

this.mockAllianceController = new Mock<AllianceController>(); 
    this.mockAllianceController.Setup(ac => ac.getAllies(this.currentRealm)).Returns(new List<string>()); 

    ... 

    this.testObj = new DiplomacyLogic(this.mockAllianceController.Object); 

제품군의 첫 번째 테스트가 널이 반환 도착 . 내가 뭘 놓치고 있니?

업데이트 : 시험

코드 :

public void ApplyRelations() { 
     List<string> allies = this.AllianceController.getAllies(this.RealmName); 
     foreach (string ally in allies) { 
      ... 
     } 
    } 

    public virtual List<string> getAllies(string realm) { 
     ... 
    } 

두 테스트 케이스 : bTest 잘 통과하면서

[Test] 
    public void aTest() { 
     this.testObj.ApplyRelations(); 
    } 

    [Test] 
    public void bTest() { 
     this.testObj.ApplyRelations(); 
    } 

ATEST는 NullReferenceException이 발생합니다. 어떤 도움이 필요합니까?

+0

첫 번째 테스트 코드를 게시하십시오. –

+0

나는 doofus입니다. 설치 후 this.currentRealm을 초기화했습니다. XD 첫 번째 테스트가 실패한 이유는 실제 질문이 아니지만 두 번째 테스트가 통과 한 이유는 무엇입니까? [TearDown]없이 this.currentRealm이 파괴되지 않았나요? – Shane

답변

2

getAlliesthis.currentRealm의 선언을 표시하는 것이 도움이됩니다. 이에

this.mockAllianceController.Setup(ac => ac.getAllies(this.currentRealm)).Returns(new List<string>()); 

:

this.mockAllianceController.Setup(ac => ac.getAllies(It.IsAny<string>())).Returns(new List<string>()); 

getAllies()에 대한 매개 변수로 It.IsAny<string>()

은 그러나 당신은 아마 라인을 변경하고 싶습니다. AllianceController는 클래스가 아닌 인터페이스의 경우

+0

currentRealm은 문자열입니다. 테스트 케이스에서 지정한 문자열 이외의 다른 것으로 호출 할 때 함수가 null을 반환하도록합니다. – Shane

+1

@Shane - Wimmel이 올바른 길을 걷고 있습니다. 귀하의 경우에는 getAllies 메서드에 상수를 전달할 것입니다. 그렇게하면 currentRealm을 초기화 할 때 중요하지 않습니다. 그리고 네, 테스트 방법 (나쁜) 사이에서 상태를 공유 할 수 있습니다. 테스트 메소드에서 TearDown의 모든 필드/전역을 재설정하거나 테스트 팩터 리 메소드로 생성 된 로컬 변수 만 사용하십시오. – TrueWill

+0

예를 참조하십시오. http://stackoverflow.com/questions/6905406/does-nunit-create-a-new-instance-of-the-test-fixture-class-for-each-contained-tes – TrueWill

0

, 당신은 수행 할 수 있습니다 :

this.mockAllianceController = new Mock<AllianceController>(); 
this.mockAllianceController.CallBase = True 

이 기존 객체를 포장하고 모든 방법은 원래 오브젝트로 호출을 매핑하는 모의 객체를 생성한다는 것을 의미 (명시 적 Setup가 호출되지 않는 한) 기본적으로

내가 잘못된 순서로 이루어집니다 당신의 설정을 생각하고이 첫 번째 테스트에서 유효하지 않도록 설정을 야기

0

을 (http://code.google.com/p/moq/wiki/QuickStart#Customizing_Mock_Behavior 참조) 실행 후 두 번째 테스트 실행시 this.testObj = new DiplomacyLogic(this.mockAllianceController.Object);이 이미 생성되고 설정이 초기화됩니다. 즉, 원하는 결과를 얻으려면 설정 전에 DiplomacyLogic을 초기화해야합니다.

각 테스트마다 새로운 객체를 얻을 수 있도록 티 해드 코드도 포함되었으므로 테스트가 서로 종속되지 않도록하는 것이 좋습니다.

아래 코드를 시도해보십시오.

[Setup] 
public void Setup() 
{ 
    this.mockAllianceController = new Mock<AllianceController>(); 
    this.testObj = new DiplomacyLogic(this.mockAllianceController.Object); 

    this.mockAllianceController.Setup(ac => ac.getAllies(this.currentRealm)).Returns(new   List<string>()); 
} 

[TearDown] 
public void TearDown() 
{ 
    this.mockAllianceController = null; 
    this.testObj = null; 
} 

은 또한 설정 코드는 설치의 testmethod의 insteed에 있어야한다고 생각하고 당신이하지 maby 단지 그 방법에 대해 동일한 설정을 사용합니다 작성할 수 있습니다 다른 시험 becasuse입니다.

관련 문제