Использование родинок для издевательства над System.Net.Sockets - PullRequest
1 голос
/ 20 февраля 2012

Я пытаюсь использовать Moles для насмешки над классом Socket в System.Net.Sockets. Я успешно сгенерировал файл .moles и, создав его, добавил сборку System.Net.Moles к моим ссылкам, но он не генерирует класс MSocket. Фактически генерируется только класс MIPEndPointCollection.

Вот пример класса, который использует 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;
        }
    }
}

Дурацкий тестовый класс:

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>

Может кто-нибудь, пожалуйста, указать, что с этим не так и что нужно сделать, чтобы это сработало. Я знаю, что есть другие способы макетировать класс Socket, например, с помощью класса-обертки, который реализует мой собственный интерфейс, но я заинтересован только в том, чтобы сделать это с помощью Moles.

- Спасибо, Даниил

1 Ответ

1 голос
/ 20 февраля 2012

По моему опыту, сборка Moling System - это странно. Попробуйте это для второй строки вашего файла .moles:

<Assembly Name="System" ReflectionOnly="true" />
...