2014-10-21 2 views
-1

조롱 된 개체의 메서드가 작동합니까? 예를 들어 나는 방법 이름 Method1을 가진 객체를 가지고 있고 개체를 조롱하는 경우 :조롱 된 개체의 메서드가 작동합니까?

var mockobject= Mock<myobject>(); 

합니까 방법 작업에 대한 다음 호출 :

mockobject.Method1() 

?

모의 객체에 대해 분명히하는 것이 좋습니다.

+0

Moq? –

+0

직접 시험하기 위해 전화 했습니까? – samy

+0

예, 방금 Moq을 사용하기 시작했습니다 –

답변

1

메소드 구현을 통해 구체적인 클래스 또는 추상 클래스를 조롱하는 경우. 가상 메소드의 경우 두 가지 옵션이 있습니다.

  1. 가짜에 메소드 호출 Method1 방법의 구체적인 동작을 호출하기 위해 모의에 CallBase = true을 설정

    mockobject.Setup(x => x.Method1()).Returns(true);

  2. Setup을 만듭니다.

    mockobject.CallBase = true;

사용법 :

public class MyClass 
{ 
    public virtual int MyMethod() 
    { 
     return 5; 
    } 
} 

[Test] 
public void ShouldGiveMeZero() 
{ 
    var mockMyClass = new Mock<MyClass>(); 

    // returns default(int) 
    Assert.AreEqual(0, mockMyClass.Object.MyMethod()); 
} 

[Test] 
public void ShouldGiveMeFive() 
{ 
    var mockMyClass = new Mock<MyClass>(); 
    mockMyClass.CallBase = true; 

    // calls concrete implementation 
    Assert.AreEqual(5, mockMyClass.Object.MyMethod());    
} 

[Test] 
public void ShouldGiveMeSix() 
{ 
    var mockMyClass = new Mock<MyClass>(); 
    mockMyClass.Setup(x => x.MyMethod()).Returns(6); 

    // calls Setup 
    Assert.AreEqual(6, mockMyClass.Object.MyMethod()); 
} 
0

quickstart guide을 보면 간단한 예를 들어 볼 수 있습니다. 예 :

var mock = new Mock<IFoo>(); 
mock.Setup(foo => foo.DoSomething("ping")).Returns(true); 

Setup에 대한 호출이 모의를 만들기 위해/가짜 실제로 뭔가.

+0

확인. 그래서 아무것도하지 않습니다. 사실 내 코드에서 호출되어 이제는 null을 반환하는 메서드를 갖게되었습니다. 그래서 내가 뭔가를 할 설치 프로그램을 사용해야합니다. –

1

첫째,주의 당신의 예제의 결코 컴파일 :

mockobject.Method1() 

Method1이 mock 객체 자체에 살지 않는 - 근본적인 조롱범에 산다. 객체 인스턴스 D :

mockobject.Object.Method1(); 

그 호출의 동작은 MockBehavior 당신이 (Strict 또는 Loose)를 사용하는지에 따라 달라집니다. 또한 호출하는 메소드가 virtual으로 표시되는지 여부에 따라 다릅니다.

Method1이 가상이 아닌 경우 Mock은 가상이 아닌 메소드를 모방 할 수 없으므로 실제 유형에 대한 구현이 사용됩니다.

는 예를 들어, MyObject 경우 다음과 같이 정의된다 : 모의는 방법에 대한 다른 구현을 제공 할 수없는 때문에

public class MyObject 
{ 
    public int Method1() 
    { 
     return 1; 
    } 
} 

mockObject.Object.Method1()1를 반환합니다.이제

, Method1virtual를 선언하는 경우는 :

public virtual int Method1() 
{ 
    return 1; 
} 

MockBehavior 놀이에 온다. 기본값은 MockBehavior.Loose입니다. 즉, .Setup 메서드를 사용하여 정의되지 않은 메서드는 default(T)을 반환합니다. 여기서 T은 메서드의 반환 형식입니다. 그래서 다음과 같은 : 당신이 그렇지 않으면 반환 할 .Setup을 사용하지 않는

var mockObject = new Mock<MyObject>(MockBehavior.Default); 

int result = mockObject.Object.Method1(); 

항상 0를 반환합니다. 인스턴스에서 CallBase = true을 지정할 수도 있으며 .Setup을 사용하여 정의되지 않은 메소드에 대한 기본 구현이 호출됩니다. 이 방법 항목에 대한 기본 스텁을 만든이 상황에서

var mockObject = new Mock<MyObject>(MockBehavior.Strict); 

int result = mockObject.Object.Method1(); // Always throws an exception 
0

:

당신이 MockBehavior.Strict를 사용하는 경우, 구현되지 않은 메소드는 예외가 발생합니다.

public class MyObject { 
    public virtual void Method1() { 
     throw new NotImplementedException(); 
    } 
} 

귀하의 스텁은 다음과 같습니다 : 당신이 손으로이를 만들 수 있다면 당신은 유사한 코드를 것

public class Stub : MyObject { 
    public override void Method1() { 
    } 
} 

을 이제 당신이 수 MyObject를의 인스턴스가 대신 NotImplementedException을 얻는 원래 구현과 관계없이 Method1을 호출 할 수 있습니다.

내 용도에 유의하십시오. 가상을 사용하지 않으면 Moq가 대체 할 수있는 것이 없습니다.

이것은 실제로 내가 조롱하는 방식 중 가장 좋아하는 용도 중 하나입니다. 많은 사람들이 "조롱을위한"모든 것에 대한 인터페이스를 가지고 있습니다. 가장 기본적인 시나리오는 메소드가 가상 일 때만 필요합니다. 일반적으로 저는 거의 모든 공개 방법을 가상으로 만듭니다. 공개 메소드가 가상 일 수없는 경우 열린 원칙의 위반 가능성이 높습니다.

관련 문제