2008-09-10 8 views
1

내가 조롱하는 인터페이스 IFoo가 있다고 가정 해보십시오. 이 인터페이스에는 세 가지 메소드가 있습니다. 테스트중인 시스템이 세 가지 방법 중 적어도 하나를 호출하는지 테스트해야합니다. 얼마나 많은 시간이나 어떤 주장을하든 상관하지 않지만, 모든 방법을 무시하고 IFoo 모의를 만지지 않는 경우는 실패 사례입니다.Rhino Mocks - 적어도 하나의 메서드 그룹 중 하나 이상이 호출되는지 테스트 할 수 있습니까?

나는 Expect.Call 설명서를보고 있지만 쉽게 할 수있는 방법을 찾을 수 없습니다.

아이디어가 있으십니까?

답변

1

함수 get이 호출 될 때 Rhino 모의 객체에 람다를 실행하여 실행할 수 있습니다. 이 람다는 카운터를 증가시킬 수 있습니다. counter> 1을 가정하면 작업이 완료됩니다.

Don Kirkby 주석 : 저는 Mendelt가 Do 메소드를 언급한다고 생각합니다.

+0

저는 Mendelt가 Do 메소드를 언급한다고 생각합니다. –

+0

내 짧은 답변에 대한 유용한 의견을 보내 주셔서 감사합니다. 질문에 추가했습니다. – Mendelt

0

이 질문에 대한 답변이 확실하지 않지만 Rhino (또는 비슷한 프레임 워크/라이브러리)와 같은 작업을 수행해야 할 경우 선전 방법을 모르는 내용이있을 수 있습니다. 수동 mock을 만드는 것보다 낫다.

인터페이스를 구현하고 메소드 중 하나가 호출 될 경우 public boolean 필드를 true로 설정하는 클래스를 작성하는 것은 쉬운 일이 아니며 클래스에 설명이 포함 된 이름을 지정할 수 있습니다. 즉, 코드는 즉시 그것을 이해할 것이다.

0

정확하게 이해했다면 세 가지 지정된 방법 중 하나 이상에서 인터페이스가 한 번 이상 호출되는지 확인하고 싶습니다. the quick reference을 통해 보면 Rhino Mock에서 할 수 있다고 생각하지 않습니다.

직관적으로 나는 취약 성 테스트를 작성하려고합니다. 은 나쁜 것입니다. 이것은 테스트중인 클래스의 불완전한 명세를 의미한다. 나는 테스트를 통해 클래스와 테스트가 알려진 동작을 할 수 있도록 디자인을 통해 생각 해줄 것을 촉구한다.

예를 들어 유용하게 사용하려면 언제든지 다음과 같이 할 수 있습니다 ().은 아닙니다.

[TestFixture] 
public class MyTest { 

    // The mocked interface 
    public class MockedInterface implements MyInterface { 
     int counter = 0; 
     public method1() { counter++; } 
     public method2() { counter++; } 
     public method3() { counter++; } 
    } 

    // The actual test, I assume you have the ClassUnderTest 
    // inject the interface through the constructor and 
    // the methodToTest calls either of the three methods on 
    // the interface. 
    [TestMethod] 
    public void testCallingAnyOfTheThreeMethods() { 
     MockedInterface mockery = new MockedInterface(); 
     ClassUnderTest classToTest = new ClassUnderTest(mockery); 

     classToTest.methodToTest(); 

     Assert.That(mockery.counter, Is.GreaterThan(1)); 
    } 
} 

은 (누군가 내 코드를 확인, 나는 지금 내 머리에서이 작성한 지금은 약 년 동안 C#을 물건을 작성하지 않은) 당신이 이유를 알고 내가 관심

그래도 이러는거야.

+0

하나의 오류 : 클래스 MockedInterface가 카운터 필드를 공개해야합니다. 그것이 개인 필드 일뿐입니다. –

+0

@Andrei Rinea : 실제로 MyTest는 내부 클래스이기 때문에 MockedInterface의 모든 내부를 알고 있습니다. 실수로 내부 클래스의 개인 필드를 만들었지 만 외부 클래스에서 여전히 액세스 할 수 있음을 알게되면 놀랐습니다. – Spoike