Pregunta

Estoy tratando de usar lunares para burlarse de la clase Socket en System.net.sockets. He generado con éxito el archivo .moles y la construcción, agregó un ensamblaje de system.net.moles a mis referencias, pero no genera la clase MSocket. De hecho, solo se genera la clase MipendPointCollection.

Aquí hay una clase de muestra que usa system.net.sockets.socket:

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;
        }
    }
}

Una clase de prueba 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);
        }
    }
}

Y mi archivo .moles:

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

¿Alguien puede señalar lo que está mal con esto y qué hacer para que funcione? Sé que hay otras formas de burlarse de la clase Socket, por ejemplo, con una clase de envoltorio que implementa mi propia interfaz, pero solo estoy interesado en hacer esto usando lunares.

-Gracias Daniel

¿Fue útil?

Solución

En mi experiencia, moler el ensamblaje del sistema es peculiar. Pruebe esto para la segunda línea de su archivo .moles:

<Assembly Name="System" ReflectionOnly="true" />
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top