2011-09-14 3 views
2

소켓의 수신 방법을 조롱하려고합니다.moq mocking a buffer [] 인수

모의 작업을 수행하는 데 사용하는 임시 해결책은 다음과 같습니다. 그러나 난 그냥이 간단한 응답을 시도 실패,

[Test] 
    public void ShouldReadFromSocket() 
    { 
     byte[] thingy = null; 
     var Mock = new Mock<Test_MockSocket>(); 
     Mock.Setup(foo => foo.Receive(It.IsAny<byte[]>())).Returns(1); 
     Socket MockSocket = (Socket)Mock.Object; 
     Assert.AreEqual(1, MockSocket.Receive(thingy)); 
    } 

나는이와 과정을받을 수 조롱하려는 :

public class Test_MockSocket : Socket 
{ 
    public Test_MockSocket() : base (
        (new IPEndPoint(IPAddress.Parse("127.0.0.1"), 30000)).AddressFamily, 
        (SocketType.Stream), 
        (ProtocolType.Tcp)) 
    { 
    } 
} 

는이 테스트의 현재 버전입니다. 오류는 "System.NotSupportedException : 비 - 가상 (VB에서 오버라이드 가능) 멤버에 대한 설정이 잘못되었습니다. foo => foo.Receive (It.IsAny())"

왜 설치가 잘못 되었습니까? textstring을 byte [] 버퍼 매개 변수로 반환하도록 변경합니다.

답변

0

클래스의 가상 메서드 및 속성 만 조롱 할 수 있습니다.. 인터페이스에있는 회원을 조롱 할 수 있습니다. Socket 클래스의 Receive 메서드는 가상으로 선언되지 않으므로 Moq은 코드에 동작을 삽입 할 수 없습니다.

.NET Framework 클래스는 일반적으로 조롱에 이상적이 아니기 때문에 (필자는 제한적임) 내 커뮤니케이션에 대한 추상화 계층을 만들려는 것입니다. 따라서 소켓을 직접 처리하는 대신 모든 복잡한 통신을 숨기는 고유 한 인터페이스 및 클래스 집합을 처리하게됩니다. 모의하기가 쉬울뿐만 아니라 클래스가 느슨하게 결합되어있어 다른 기술과 쉽게 교환 할 수 있습니다.

인터페이스가 클래스보다 moq보다 훨씬 쉽습니다. 즉, 클래스가 추상 클래스이거나 기본 구현 및 확장을위한 가상 멤버가없는 기본 클래스가 아닌 경우입니다.