2012-05-14 2 views
1

아래의 코드는 최고의 내가 달성하기 위해 노력하고 있습니다에 대해 설명 :MOQ - 확인 증분 속성 호출

[Test] 
public void ReplayGoalTeamATest() 
{ 
    var stateMachineMock = new Mock<IIceHockeyOddsStateMachine>(); 

    new IceHockeyActionLogRecord { Event = "goal", Team = "A"}.Replay(stateMachineMock.Object); 

    stateMachineMock.Verify(s=>s.TeamAScore++); //Syntax error 
} 
+1

은 (재산보다 BTW 방법을 사용하는 것이 더이 경우)의 경우 내 업데이 트를 참조하십시오 –

+0

좋아요, 감사합니다. 나는 TeamAScore ++가 게터가없는 소품에 대해 말도 안된다는 것을 깨달았을 때 질문에서 편집 테스트를 제거했으며, 오직 세터 만이 mehtod가되어야하는 소품에 동의합니다. –

답변

1

당신이 s.TeamAScore++을 수행 할 때 다음 다른 두가 작업을 설정하고 확인해야합니다. 내가 명시 적으로 종속과 이러한 상호 작용을 정의와 함께 가고 싶어요, 그래서

int score = stateMachine.TeamAScore; 
// other staff 
stateMachine.TeamAScore = score + 1; 

: 첫 번째 조치는 종속에서 현재의 점수를 받고 있으며, 두 번째 작업은 새로운 점수를 설정하는 것입니다이 경우

// Arrange 
Mock<IIceHockeyOddsStateMachine> stateMachineMock = new Mock<IIceHockeyOddsStateMachine>(); 
stateMachineMock.SetupGet(s => s.TeamAScore).Returns(0); 
IceHockeyActionLogRecord record = new IceHockeyActionLogRecord { Event = "goal", Team = "A"}; 
// Act 
record.Replay(stateMachineMock.Object); 
// Assert 
stateMachineMock.VerifySet(s => s.TeamAScore = 1); 

당신 당신의 IceHockeyActionLogRecord, 그것이 어떻게 의존성과 상호 작용 하는지를 테스트하고 있습니다. 테스트는 객체 간의 상호 작용을 지정합니다.

TeamAScore 값을 확인할 때 모의 구현을 테스트하고 있습니다. 또한 콜백을 사용하면 객체 간의 상호 작용을 테스트하는 대신 코드를 테스트 할 수 있습니다.

또한, 나는 테스트 내부에 매직 넘버의 이름을 줘야 할 것, 또는 매개 변수를 제공합니다

[TestCase(0, 1)] 
[TestCase(50, 51)] 
public void ShouldIncrementTeamScore(int initialScore, int expectedScore) 
{ 
    var stateMachineMock = new Mock<IIceHockeyOddsStateMachine>(); 
    stateMachineMock.SetupGet(s => s.TeamAScore).Returns(initialScore); 
    IceHockeyActionLogRecord foo = new IceHockeyActionLogRecord(); 
    foo.Replay(stateMachineMock.Object); 
    stateMachineMock.VerifySet(s => s.TeamAScore = expectedScore);    
} 

UPDATE를 : 당신의 인터페이스를하지 않는 속성에 대한 게터이있는 경우, 단지 시험의 일부를 정렬 수정 (안 설치 속성 게터 호출을 할) : 재산은 세터가있는 경우

// Arrange 
var stateMachineMock = new Mock<IIceHockeyOddsStateMachine>(); 
var record = new IceHockeyActionLogRecord { Event = "goal", Team = "A"}; 
// Act 
record.Replay(stateMachineMock.Object); 
// Assert 
stateMachineMock.VerifySet(s => s.TeamAScore = 1); 
0

는 유 대신 .CallBack() 메소드를 사용하여 시도가? 당신이 당신의 IIceHockeyOddsStateMachine 인터페이스에서 getter와 setter를 모두있는 경우 반드시 구현

+0

아니요, 위의 컴파일되지 않습니다. 콜백 사용; 문제는 남아 있습니다. TeamAScore가 증가 할 것이라는 기대를 어떻게 표현합니까? –

2

위의 지원을 확인하지, 당신은 값이이 같이 증가 된 것을 확인할 수 :

var stateMachineMock = new Mock<IIceHockeyOddsStateMachine>(); 

stateMachineMock.SetupAllProperties(); 

stateMachineMock.Object.TeamAScore = 0; 

new IceHockeyActionLogRecord { Event = "goal", Team = "A"}.Replay(stateMachineMock.Object); 

Assert.That(stateMachineMock.Object.TeamAScore, Is.EqualTo(1)); 
+0

그게 좋을거야, 고마워, 정말로 분명해! –