는 예외 던질 것으로 예상되는 생성자을 감안할 때 : 나는 코뿔소와 Machine.Fakes을 사용하는 방법Machine.Fakes를 사용하여 생성자가 로컬 메서드를 호출하지 않도록하려면 어떻게해야합니까?
public class MyObject
{
public MyObject(String name)
{
if (String.IsNullOrEmpty(name))
throw new ArgumentNullException("name");
this.Initialize();
}
protected virtual void Initialize()
{
// do stuff
}
}
(기본값, 나는 코뿔소로 이동하고)이 클래스를 조롱하고, 그 테스트 :
- 그것은 예상되는 예외
- 을 던져 내가 실제 MyObject를 조롱 수, 초기화() MOQ와
를 호출하지 않습니다 클래스 자체와 모의 객체를 Callbase = true
으로 설정하면 일반 클래스처럼 작동합니다.
난 다음이 함께 예외가 발생했다 둘 것을, 그리고 메소드가 호출되지 않았 음을 확인할 수 있습니다
// all pseudo code to prove my point of "creating an instance"
//
void when_creating_new_MyObject_with_null_Name_should_throw_Exception()
{
// arrange
Mock<MyObject> myObjectToTest = new Mock<MyObject>(String.Empty);
myObjectToTest.Callbase = true;
// act
Assert.Throws<ArgumentNullException>(() =>
var instance = myObjectToTest.Object;
);
}
void when_creating_new_MyObject_with_null_Name_should_not_call_Initialize()
{
// arrange
Mock<MyObject> myObjectToTest = new Mock<MyObject>(String.Empty);
myObjectToTest.Callbase = true;
// act
try
{
// creates an instance
var instance = myObjectToTest.Object;
}
catch {}
// assert
myObjectToTest.Verify(x => x.Initialize(), Times.Never());
}
하지만이를 조롱하는 페이크 승/MSpec을 사용하는 방법을 알아내는 데 문제가 있어요 :
[Subject(typeof(MyObject), "when instantiating a new instance")
class with_null_Name
{
static MyObject myObjectToTest;
static Exception expectedException;
Establish context =()=>
myObjectToTest = An<MyObject>(String.Empty);
Because of; // I don't think there is anything to act on here?
It should_throw_Exception;
// how to capture exception with An<T>()?
It should_not_call_Initialize =() =>
myObjectToTest.WasNotToldTo(x => x.Initialize());
}
내가 알고 내 Because of
행위에 일반적으로 Catch.Exception(...)
를 사용합니까. 그러나이 유스 케이스는 그렇게 작동하지 않는 것 같습니다.
모든 포인터가 감사하겠습니다.
감사합니다.
면책 조항 : 실제 사용 사례는 초기화 된 무거운 물체로 인해 상당히 복잡하며 캐시 된지지 부재로는 상당히 비쌉니다. 위의 코드는 단순화 된 버전입니다.
내가 제대로 여기를 캡슐화 생각합니다. 대답으로 표시하고 (조금 리팩토링 할 것입니다). – eduncan911
'내 직감은 테스트하기에 너무 세밀하다는 것입니다.'이것이 당신의 기대에 불가결 한 것이라면, 테스트하기에는 너무 세밀하지 않습니다. –