moq насмехается над аргументом buffer [] - PullRequest
2 голосов
/ 14 сентября 2011

Я пытаюсь смоделировать метод получения сокета.

Вот обходной путь, который я использую, чтобы заставить макет работать.

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

и это текущая версиятест:

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

Я хочу смоделировать процесс получения с этим, однако мне не удается просто попробовать этот простой ответ.Ошибка «System.NotSupportedException: недопустимая установка для не виртуального (переопределяемого в VB) члена: foo => foo.Receive (It.IsAny ())»

, почему мои настройки неверны и чтомне нужно изменить, чтобы вернуть текстовую строку в качестве параметра буфера byte [].

1 Ответ

0 голосов
/ 14 сентября 2011

Виртуальные методы и свойства можно использовать только для класса . Вы можете издеваться над любым членом на интерфейсе . Метод Receive в классе Socket не объявлен виртуальным, поэтому Moq не может внедрить поведение в код.

Поскольку классы платформы .NET обычно не идеальны для насмешек, я понимаю (что, по общему признанию, ограничено), что вы хотите создать уровень абстракции для вашего общения. Таким образом, вместо непосредственного взаимодействия с сокетом, вы будете иметь дело со своим собственным набором интерфейсов и классов, которые скрывают всю сложность вашего общения. Это не только облегчает насмешку, но и делает ваше общение легко взаимозаменяемым с другими технологиями, поскольку ваши классы слабо связаны.

Интерфейсы гораздо проще создавать, чем классы, то есть, если ваш класс не является абстрактным классом или базовым классом с реализациями по умолчанию и виртуальными членами для расширения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...