2009-12-03 1 views
8

테스트 결과 올바른 매개 변수를 사용하여 특정 메서드가 호출되었는지 어떻게 테스트 할 수 있습니까? NUnit을 사용하고 있습니다.특정 메소드가 NUnit을 사용하여 호출되었다는 것을 어떻게 주장 할 수 있습니까?

이 메서드는 아무 것도 반환하지 않습니다. 그냥 파일에 씁니다. System.IO.File에 대한 mock 객체를 사용하고 있습니다. 그래서 함수 호출 여부를 테스트하고 싶습니다.

답변

10

더 많은 컨텍스트가 필요합니다. 그래서 믹스에 MOQ를 추가 여기에 1 점을 추가하는 듯합니다 :

코뿔소 모의 객체에서
pubilc class Calc { 
    public int DoubleIt(string a) { 
     return ToInt(a)*2; 
    } 

    public virtual int ToInt(string s) { 
     return int.Parse(s); 
    } 
} 

// The test: 
var mock = new Mock<Calc>(); 
string parameterPassed = null; 
mock.Setup(c => x.ToInt(It.Is.Any<int>())).Returns(3).Callback(s => parameterPassed = s); 

mock.Object.DoubleIt("3"); 
Assert.AreEqual("3", parameterPassed); 
+0

Calc가 추상 또는 인터페이스가 아닌 경우이 기능이 작동합니까? 내가 아는 한'Moq'은 동적 인 프록시를 만들어서 새로운 일리노이 명령을 생성 할 수 없도록 만든다. – kuskmen

11

Typemock 또는 Rhino Mocks 또는 NMocks2과 같은 일부 조롱 프레임 워크를 사용해야합니다.

NUnit에도 Nunit.Mock이 있지만 잘 알려지지 않았습니다.

MOQ의 구문은 here 찾을 수 있습니다 또한

var mock = new Mock<ILoveThisFramework>(); 

// WOW! No record/reply weirdness?! :) 
mock.Setup(framework => framework.DownloadExists("2.0.0.0")) 
    .Returns(true) 
    .AtMostOnce(); 

// Hand mock.Object as a collaborator and exercise it, 
// like calling methods on it... 
ILoveThisFramework lovable = mock.Object; 
bool download = lovable.DownloadExists("2.0.0.0"); 

// Verify that the given method was indeed called with the expected value 
mock.Verify(framework => framework.DownloadExists("2.0.0.0")); 

, System.IO.File에서 객체가 인터페이스가없는, 그래서 만약 당신이 단지, 인터페이스을 조롱 할 수 있습니다는 아마 당신은 '수 할. 당신은 자신의 커스텀 클래스 안에서 System.IO.File으로 전화를 걸어야합니다.

+2

NUnit은 테스트를 실행하며 조롱이나 검증을하지 않습니다. 다른 책임. Moq를 사용하지는 않았지만 mock 객체에 대한 기대치를 확인할 수 있어야합니다. – kyoryu

+0

네가 틀린 곳을보고 있었다 ... 나는 너를보고 있었다. 지금 나는 moq을보고있다. :) –

+0

MOQ를 사용하면 추상 수업을 조롱 할 수도 있습니다. –

3

인터페이스 용 모의를 사용합니다.

인터페이스 Finder을 사용하는 클래스 ImplClass이 있고 "hello"인수로 Search 함수가 호출되도록하려는 경우,

그래서 우리는이 :

FinderMock mock = new FinderMock("hello"); 
ImplClass impl = new ImplClass(mock); 
impl.doStuff(); 
Assert.AreEqual(1, mock.numTimesCalled); 
:

public interface Finder 
{ 
    public string Search(string arg); 
} 

다음

public class ImplClass 
{ 
    public ImplClass(Finder finder) 
    { 
    ... 
    } 
    public void doStuff(); 
} 

당신이 당신의 테스트 코드

private class FinderMock : Finder 
{ 
    public int numTimesCalled = 0; 
    string expected; 
    public FinderMock(string expected) 
    { 
    this.expected = expected; 
    } 
    public string Search(string arg) 
    { 
    numTimesCalled++; 
    Assert.AreEqual(expected, arg); 
    } 
} 

다음 테스트 코드에 대한 모의를 쓸 수 있습니다

2

여기

AssertWasCalled

라는 방법입니다 것은

var mailDeliveryManager = MockRepository.GenerateMock<IMailDeliveryManager>(); 
 

 
var mailHandler = new PlannedSending.Business.Handlers.MailHandler(mailDeliveryManager); 
 

 
mailHandler.NotifyPrinting(User, Info); 
 

 
mailDeliveryManager.AssertWasCalled(x => x.SendMailMessage(null, null, null), o => o.IgnoreArguments());

를 사용하는 방법입니다
관련 문제