2012-02-20 2 views
1

Mole을 사용하여 System.Net.Sockets의 Socket 클래스를 모의하려고합니다. .moles 파일을 성공적으로 생성하고이를 작성하여 System.Net.Moles 어셈블리를 내 참조에 추가했지만 MSocket 클래스를 생성하지는 않습니다. 사실 MIPEndPointCollection 클래스 만 생성됩니다.두더지를 사용하여 System.Net.Sockets 모의

using System.Text; 
using System.Net.Sockets; 

namespace MyProject 
{ 
    public static class Communicator 
    { 
     public static int Send(string messages) 
     { 
      byte[] bytes = Encoding.ASCII.GetBytes(messages); 
      int bytesSent = 0; 
      using (Socket socket = new Socket(AddressFamily.InterNetwork, 
       SocketType.Stream, ProtocolType.Tcp)) 
      { 
       socket.Connect("localhost", 1234); 
       bytesSent = socket.Send(bytes); 
      } 

      return bytesSent; 
     } 
    } 
} 

dumy 테스트 클래스 :

using MyProject; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using System; 
using System.Net.Moles; 
using Microsoft.Moles.Framework; 

[assembly: MoledType(typeof(System.Net.Sockets.Socket))] 

namespace MyProjectTest 
{ 
    [TestClass()] 
    public class CommunicatorTest 
    { 
     private TestContext testContextInstance; 
     public TestContext TestContext 
     { 
      get { return testContextInstance; } 
      set { testContextInstance = value; } 
     } 

     [TestMethod()] 
     [HostType("Moles")] 
     public void SendTest() 
     { 
      //dose not exist in the System.Net.Moles namespace: 
      //MSocket.Send = deligate(){ return 0; }; 
      int bytesSent = Communicator.Send("Test Message"); 
      Assert.AreEqual(0, bytesSent); 
     } 
    } 
} 

그리고 내 .moles 파일 :

<Moles xmlns="http://schemas.microsoft.com/moles/2010/"> 
    <Assembly Name="System.Net" /> 
</Moles> 
다음

은을 System.Net.Sockets.Socket를 사용하는 샘플 클래스입니다

누군가가이 문제가 무엇이 었는지와 그것이 효과를 내기 위해 무엇을해야하는지 알려줄 수 있습니까? 내 자신의 인터페이스를 구현하는 래퍼 클래스로 예를 들어 Socket 클래스를 조롱하는 다른 방법이 있지만 저는 Moles를 사용하여이를 수행하는 데에만 관심이 있다는 것을 알고 있습니다.

--Thanks 다니엘은 내 경험에

+0

"나는 내 자신의 인터페이스를 구현하는 래퍼 클래스와 함께 예를 들어, Socket 클래스를 조롱하는 다른 방법이 있다는 것을 알고 있지만 나는에만 관심이 있어요 Moles를 사용하여이 작업을 수행합니다. " ** IMHO ** ** 유효한 유일한 이유는 비교적 큰 레거시 코드베이스를 다루는 경우입니다. 그렇지 않은 경우 래퍼 + 인터페이스로 이동하십시오. – TrueWill

+1

@ TwitterWill 당신이 최근에 본 당신 블로그 포스트와 일치하는 것 같습니다. 필자는 코드를 가능한 분리 된 상태로 유지하기 위해 외부 효과에 대한 얇고 박탈 된 래퍼 개념을 좋아합니다. 나는 XDocument API처럼 단순한 것으로 실험 해 보았고 일반적으로 견고한 접근 방법을 찾았다. –

답변

1

, Moling은 시스템 어셈블리는 황당. 당신의 .moles 파일의 두 번째 줄이 시도 :

<Assembly Name="System" ReflectionOnly="true" /> 
관련 문제