2013-12-20 5 views
2

RhinoMock을 사용하여 다음 동작을 에뮬레이트하는 방법은 무엇입니까?RhinoMock에서 지정된 조건에 따라 메서드에서 값을 반환하는 방법은 무엇입니까?

테스트 된 메서드는 인터페이스에서 ReceivePayment 메서드를 호출합니다.

public void TestedMethod(){ 
    bool result = interface.ReceivePayment();   
} 

인터페이스에 CashAccepted 이벤트가 있습니다. ReceivePayment shoud는이 이벤트가 여러 번 (조건에 의해) 호출 된 경우 true를 반환합니다.

어떻게 이러한 작업을 수행 할 수 있습니까?

업데이트.

는 이제 다음을 수행하십시오 작업 실행 안에 있기 때문에

UpayError error; 
     paymentSysProvider.Stub(i => i.ReceivePayment(ticketPrice, 
      App.Config.SellingMode.MaxOverpayment, uint.MaxValue, out error)) 
      .Do(new ReceivePaymentDel(ReceivePayment)); 

     paymentSysProvider.Stub(x => x.GetPayedSum()).Return(ticketPrice); 

     session.StartCashReceiving(ticketPrice); 

     paymentSysProvider.Raise(x => x.CashInEvent += null, cashInEventArgs); 

public delegate bool ReceivePaymentDel(uint quantityToReceive, uint maxChange, uint maxTimeout, out UpayError error); 
public bool ReceivePayment(uint quantityToReceive, uint maxChange, uint maxTimeout, out UpayError error) { 
     Thread.Sleep(5000); 
     error = null; 
     return true; 
    } 

StartCashReceiving 즉시 반환합니다. 하지만 다음 줄 : paymentSysProvider.Raise (...)가 ReceivePayment 스텁 완료를 기다리고 있습니다!

답변

2

당신은 WhenCalled를 사용할 수 있습니다. 당신이 트리거

bool fired = false; 

// set a boolean when the event is fired. 
eventHandler.Stub(x => x.Invoke(args)).WhenCalled(call => fired = true); 

// dynamically return whether the eventhad been fired before. 
mock 
    .Stub(x => x.ReceivePayment()) 
    .WhenCalled(call => call.ReturnValue = fired) 
    // make rhino validation happy, the value is overwritten by WhenCalled 
    .Return(false); 

: 사실 나는 당신의 질문 (? 이벤트가 모의하거나 이벤트를 처리하는 테스트 대상 장치에 의해 해고)

몇 가지 샘플 코드가 이해하지 못했다 테스트의 이벤트에서 발사 후 모의를 다시 구성 할 수도 있습니다.

mock 
    .Stub(x => x.ReceivePayment()) 
    .Return(false); 

paymentSysProvider.Raise(x => x.CashInEvent += null, cashInEventArgs); 

mock 
    .Stub(x => x.ReceivePayment()) 
    .Return(true) 
    .Repeat.Any(); // override previous return value. 
2

ReceivePayment를 테스트하고 계십니까? 그렇지 않다면 인터페이스가 어떻게 구현되는지 걱정할 필요가 없습니다 (http://blinkingcaret.wordpress.com/2012/11/20/interaction-testing-fakes-mocks-and-stubs/ 참조).

interface.Stub(i => i.ReceivePayment()).Do((Func<bool>) (() => if ... return true/false;)); 

참조 : 당신은, 당신은 예를 들어 수도 있었죠 확장 방법을 사용할 수 있습니다해야하는 경우

http://ayende.com/blog/3397/rhino-mocks-3-5-a-feature-to-be-proud-of-seamless-do http://weblogs.asp.net/psteele/archive/2011/02/02/using-lambdas-for-return-values-in-rhino-mocks.aspx

+0

고맙습니다. Em ... 글쎄, 나는 그 수업의 복잡한 행동을 시험하려고 노력하고있어. 지정된 조건이 충족되면 ReceivePayment는 true를 반환해야합니다. 조건을 만족 시키려면 CashAccepted 이벤트를 발생시켜야합니다. – EngineerSpock