2014-09-05 3 views
3

Mac OS X에서 Xamarin Studio를 사용하여 간단한 응용 프로그램을 개발하기 위해 테스트 기반 개발을 사용하고 있습니다. 시험용 도구로 NUnit을, 조롱을 위해 FakeItEasy를 사용하고 있습니다. 나는 이벤트를 발생시키는 객체를 개발했으며 그 객체에 대한 다른 객체의 응답을 테스트하려고하지만 응답 객체는 테스트에서 발생하는 모든 이벤트를 수신하지 못하는 것으로 보입니다. EVENTCOUNT이이 테스트를 통과하기 위해 걸립니까 무엇 0이기 때문에FakeItEasy 모의 단위 테스트에서 이벤트를 실행할 수 없습니다.

using System; 
using NUnit.Framework; 
using FakeItEasy; 

namespace EventTest 
{ 
    public class EventProvider 
    { 
     public delegate void EventDelegate(object sender, EventArgs arguments); 

     public EventDelegate Event; 
    } 

    class EventResponder 
    { 
     public EventResponder(EventProvider provider) 
     { 
      provider.Event += (sender, arguments) => ++EventCount; 
     } 

     public uint EventCount { get; private set; } 
    } 

    [TestFixture] 
    public class EventResponderTest 
    { 
     [Test] 
     public void ResponseToFiredEvent() 
     { 
      var eventProvider = A.Fake<EventProvider>(); 

      EventResponder responder = new EventResponder(eventProvider); 

      eventProvider.Event += Raise.WithEmpty().Now; 
      eventProvider.Event += Raise.WithEmpty().Now; 
      eventProvider.Event += Raise.WithEmpty().Now; 

      Assert.AreEqual(3, responder.EventCount); 
     } 
    } 
} 

시험은 실패

다음 코드는 문제를 보여?

답변

1

FakeItEasy가 위조 된 회원이 가상이거나 더 일반적으로 재정의 할 수 있어야하고 the same holds for events that FakeItEasy raises이 필요하기 때문에 테스트가 작동하지 않습니다. 현재 이벤트는 무시할 수 없습니다. 인터페이스 대신에 따라

  • 변화 인터페이스 뒤에 가상 (public virtual event EventDelegate Event;)
  • 숨기기 EventProvider 구현 Event 멤버 대신 클래스의 가짜 인터페이스를, 그리고 소비자 (EventResponder)을합니다 그것을 수정하거나하려면
+0

@BlairConrad : 프레임 워크 **가 이러한 상황 (DynamicProxy 제한으로 인해 잠금 해제 가능한 것을 조롱하려고 시도)에 대해 경고하거나 던지면 정말 좋을 것입니다. IME,이 문제와 관련하여 내가 대답 한 질문의 양은 어떻게 든 초심자에게는 명백한 주제가 아님을 증명합니다. –

+0

많은 경우 (가능한 한 많은 사람들이), FakeItEasy는 우리가 조롱 할 수없는 것을 조롱하려고 할 때 던졌습니다. 비 가상 메소드에서'A.CallTo'를 실행 해보십시오. 멋진 오류가 있습니다. 나는 몇몇 지점을 놓친 것이 확실하지만, 우리가 그런 것을 들었을 때, 우리는 명백한 오류를 추가하려고합니다. 여기 어떻게 할 수 있는지 보지 못했습니다. 가짜 개체가 전혀 없습니다. 'Raise'는 작동에 가짜가 아니며'EventResponder'는 테스트에서 가짜가 아닙니다. 당신이 다르게 생각하고 조사 할 시간과 성향이 있다면 @jimmy_keen, 길을 찾아보십시오. 여기서 행동을 개선 할 수있는 기회를 환영합니다. –

+0

이벤트 멤버를 어떻게 가상으로 만들 수 있는지 잘 모르겠습니다. 변경하려고하면 : public virtual EventDelegate Event; 컴파일 할 때이 오류가 발생합니다. 수정 자 'virtual'은이 항목에 유효하지 않습니다. 다음과 같이 시도해보십시오. public EventDelegate virtual Event; 이 컴파일러 오류가 발생합니다 : 예기치 않은 sybmol ';' 클래스, 구조체 또는 인터페이스 멤버 선언에 –

관련 문제