조롱 된 개체의 메서드가 작동합니까? 예를 들어 나는 방법 이름 Method1
을 가진 객체를 가지고 있고 개체를 조롱하는 경우 :조롱 된 개체의 메서드가 작동합니까?
var mockobject= Mock<myobject>();
합니까 방법 작업에 대한 다음 호출 :
mockobject.Method1()
?
모의 객체에 대해 분명히하는 것이 좋습니다.
조롱 된 개체의 메서드가 작동합니까? 예를 들어 나는 방법 이름 Method1
을 가진 객체를 가지고 있고 개체를 조롱하는 경우 :조롱 된 개체의 메서드가 작동합니까?
var mockobject= Mock<myobject>();
합니까 방법 작업에 대한 다음 호출 :
mockobject.Method1()
?
모의 객체에 대해 분명히하는 것이 좋습니다.
메소드 구현을 통해 구체적인 클래스 또는 추상 클래스를 조롱하는 경우. 가상 메소드의 경우 두 가지 옵션이 있습니다.
Method1
방법의 구체적인 동작을 호출하기 위해 모의에 CallBase = true
을 설정 mockobject.Setup(x => x.Method1()).Returns(true);
을 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());
}
quickstart guide을 보면 간단한 예를 들어 볼 수 있습니다. 예 :
var mock = new Mock<IFoo>();
mock.Setup(foo => foo.DoSomething("ping")).Returns(true);
주 Setup
에 대한 호출이 모의를 만들기 위해/가짜 실제로 뭔가.
확인. 그래서 아무것도하지 않습니다. 사실 내 코드에서 호출되어 이제는 null을 반환하는 메서드를 갖게되었습니다. 그래서 내가 뭔가를 할 설치 프로그램을 사용해야합니다. –
첫째,주의 당신의 예제의 결코 컴파일 :
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
를 반환합니다.이제
, Method1
가 virtual
를 선언하는 경우는 :
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
:
당신이 MockBehavior.Strict
를 사용하는 경우, 구현되지 않은 메소드는 예외가 발생합니다.
public class MyObject {
public virtual void Method1() {
throw new NotImplementedException();
}
}
귀하의 스텁은 다음과 같습니다 : 당신이 손으로이를 만들 수 있다면 당신은 유사한 코드를 것
public class Stub : MyObject {
public override void Method1() {
}
}
을 이제 당신이 수 MyObject를의 인스턴스가 대신 NotImplementedException을 얻는 원래 구현과 관계없이 Method1을 호출 할 수 있습니다.
내 용도에 유의하십시오. 가상을 사용하지 않으면 Moq가 대체 할 수있는 것이 없습니다.
이것은 실제로 내가 조롱하는 방식 중 가장 좋아하는 용도 중 하나입니다. 많은 사람들이 "조롱을위한"모든 것에 대한 인터페이스를 가지고 있습니다. 가장 기본적인 시나리오는 메소드가 가상 일 때만 필요합니다. 일반적으로 저는 거의 모든 공개 방법을 가상으로 만듭니다. 공개 메소드가 가상 일 수없는 경우 열린 원칙의 위반 가능성이 높습니다.
Moq? –
직접 시험하기 위해 전화 했습니까? – samy
예, 방금 Moq을 사용하기 시작했습니다 –