2011-08-19 2 views
1

System.IO.Ports.SerialPort의 SerialDataReceived 이벤트에 응답하는 이벤트 처리기를 유닛 테스트해야합니다. 이 이벤트 핸들러는 서명단위 테스트를위한 개인 생성자를 사용하여 유형의 인스턴스를 만드는 방법은 무엇입니까?

void SerialDataReceived(object sender, SerialDataReceivedEventArgs e) 

내 단위 테스트 메소드로 호출 할 때, 그것은 SerialDataReceivedEventArgs 인스턴스를 필요가있다. 그러나이 객체에는 private 생성자가 있습니다. 그러면 SerialDataReceivedEventArgs을 메서드에 전달하려면 어떻게해야합니까?

나는 명백한 기술을 여기에서 놓치고 있어야한다라고 확신한다, 나는 긴 날을 보내었다. .. 어떤 충고는 좋습니까?

+0

조롱 프레임 워크를 사용하여 이벤트를 조롱해도 될까요? – luketorjussen

+1

당신이 이것을보고 싶어 할 수도 있습니다 - http://stackoverflow.com/questions/7045776/strategy-to-simulate-events-in-object-under-test – luketorjussen

답변

4

당신은 반사를 사용하여 원하는 형식의 인스턴스를 만들 수 있습니다

나는 결국이 같은 개인 생성자, 제거하기 위해 내 코드를 리팩토링
var args = typeof(SerialDataReceivedEventArgs) 
    .GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new [] { typeof(SerialData) }, null) 
    .Invoke(new object[] { SerialData.Chars }); 
+0

감사합니다 알렉산더. 그 MSpec 태그를 지불 할 것이라고 덧붙였다 ;-) Moles를 조사하는 데 많은 시간을 보낸 후에, 나는 약간 다른 해결책을 생각해 내 대답을 아래에 참조하십시오. –

2

개인 생성자가있는 클래스의 인스턴스를 직접 만들 수 없습니다. 리플렉션을 사용하여이를 수행 할 수는 있지만 매우 불쾌한 해결책입니다.

1

: 그래서 지금 내가 할 수있는

private void HandleSerialDataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     SerialDataReceived(sender, e.EventType); 
    } 

    /// <summary> 
    /// This method executes in response to the <see cref="ISerialPort.DataReceived"/> event 
    /// via <see cref="HandleSerialDataReceived"/> and is called on its own worker thread. 
    /// </summary> 
    internal void SerialDataReceived(object sender, SerialData eventType) 
    { 
    ... 
    } 

을 내 단위 테스트를 SerialDataReceived으로 설정하고 SerialData 매개 변수를 직접 전달하십시오.

그러나 알렉산더의 솔루션을 선호한다고 생각합니다. 제 프로덕션 코드를 다시 고려할 필요가 없기 때문입니다.

관련 문제