Как ложные платформы работают?

Если бы я должен был записать библиотеку насмешки, как это работало бы (другими словами, как "они работают?)?

Одна из вещей, которая интересно, - то, что Вы всегда устанавливаете ожидания поэтому действительно, необходимо сравнить ожидание с тем, что метод делает во времени выполнения, таким образом, я предполагаю, что отражение (разрешение типов во времени выполнения) требуется.

Кроме того, при использовании термина "фиктивный объект" погашен объект, или это был бы объект с предварительно установленными ожиданиями?

Когда я думаю, как я записал бы свою собственную реализацию платформы/техники, как фиктивные объекты, я понимаю, сколько я действительно знаю (или не знайте), и на чем я сбил бы с толку: Если фиктивный объект предварительно запрограммирован для возврата ожиданий набора, и Вы не называете фактический реальный объект, то результатом не всегда было бы то же? Например:

[TestMethod, Isolated]
public void FakeReturnValueByMethodArgs()
{
    var fake = Isolate.Fake.Instance<ClassToIsolate>();
    // MethodReturnInt will return 10 when called with arguments 3, "abc"
    Isolate.WhenCalled(()=> fake.MethodReturnInt(3,   "     abc")).WithExactArguments().WillReturn(10);
// MethodReturnInt will return 50 when called with arguments 3, "xyz"
    Isolate.WhenCalled(()=> fake.MethodReturnInt(3, "xyz")).WithExactArguments().WillReturn(50);

     Assert.AreEqual(10, fake.MethodReturnInt(3, "abc"));
    Assert.AreEqual(50, fake.MethodReturnInt(3, "xyz"));

}

Это не всегда возвращало бы true?

8
задан GurdeepS 16 February 2010 в 22:58
поделиться

4 ответа

Мои мысли:

  1. Это, вероятно, означает «идти».
  2. Postgresql также использует\g в качестве терминатора оператора. Postgresql старше MySQL, так что это могло повлиять на них.

Но, как я указал в своем комментарии к посту Андриева выше, это на самом деле делает верхний регистр, который заставляет дисплей располагаться вертикально. Нижний регистр\g не имеет такого эффекта, или если он имеет, то в документации его не упоминается. (У меня нет установки MySQL, которую можно было бы опробовать.)

-121--1607234-

У вас есть правильная идея. Вы часто обнаружите, что у них есть пара режимов работы. Если вы беспокоитесь о том, что ваш метод не будет вызван или он не будет вызван в правильном порядке, то довольно часто существует «строгий» режим, который заставляет модельную структуру создавать исключение, если метод не вызывается к концу теста, или вызывается с неправильными параметрами и т.д.

Большинство рамок подумали о таких проблемах, поэтому вам просто нужно узнать, как настроить его для вашего сценария.

-121--3690458-

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

Макет реального мира будет выглядеть более следующим образом:

[TestMethod, Isolated]
public void FakeReturnValueByMethodArgs() {
    var fake = Isolate.Fake.Instance<DependencyClass>();
    // MethodReturnInt will return 10 when called with arguments 3, "abc"
    Isolate.WhenCalled(()=> fake.MethodReturnInt(3, "abc")).WithExactArguments().WillReturn(10);

    var testClass = new TestClass(fake);
    testClass.RunMethod();

    // Verify that the setup methods were execute in RunMethod()
    // Not familiar with TypeMock's actual method to do this...
    IsolatorExtensions.VerifyInstanceWasCalled(fake);  

    // Or assert on values
    Assert.AreEqual(10, testClass.AProperty);
}

Обратите внимание на то, как макет передается в Test Class и на нем запускается метод.

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


Обновление: Объяснение, почему вы тестируете только макетную структуру:

То, что вы сделали, это создали метод MethodReturnInt с макетной структурой с помощью Isolate.WhenCalled () . При вызове MethodRecturnInt в Assert код запускает делегат () = > fake. MethodReturnInt () и возврат 10. Насмешливая структура эффективно создает метод (пусть и динамически), который выглядел бы примерно так:

public void MethodReturnInt(int value, string value2) {
    Assert.Equal(3, value);
    Assert.Equal("abc", value2);
    return 10;
}

Это немного сложнее, чем это, но это общая идея. Так как вы никогда не запускаете код, кроме создания 2 методов, а затем утверждаете эти два метода, вы не тестируете свой собственный код и, следовательно, только тестируете насмешливую рамку.

8
ответ дан 5 December 2019 в 20:16
поделиться

Да, всегда будет возвращать истину. Мок-объекты следует использовать, когда тестируемому классу требуется реализация другого класса, которую вы не хотите использовать в тестовом прогоне. Это наиболее полезно, когда это класс, который использует интерфейсы с несколькими реализациями, или есть сложные / дорогие / внешние службы, которые вы не хотите настраивать.

В приведенном выше коде вы издеваетесь над классом, который «тестируете».

Другой способ думать об этом заключается в том, что фиктивное поведение, которое вы записываете, является утверждениями черного ящика (реализация), где Assert. * - утверждениями белого ящика (api).

0
ответ дан 5 December 2019 в 20:16
поделиться

Один из способов посмотреть на то, как работает mock-система - это просто посмотреть на те случаи, когда вам нужен объект, но вы не хотите использовать настоящий класс, а хотите, чтобы он предоставил вам какой-то конкретный вид данных, который он не сможет (или не сможет сделать это надежно). Так, если вы видите:

Assert.IsTrue(myLogic.IsNoon(time))

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

0
ответ дан 5 December 2019 в 20:16
поделиться

Vireshark фактически использует Winpcap для этого, и, как показывает другой ответ, вы также можете использовать его.

Можно также использовать класс System.Net.Sockets.Socket и перевести его в неразборчивый режим. Я использую это для захвата IP-трафика (например, TCP и UDP) из данного сетевого интерфейса. Вот пример.

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

Socket socket =
    new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
socket.Bind(new IPEndPoint(IPAddress.Parse("X.X.X.X"), 0)); // specify IP address
socket.ReceiveBufferSize = 2 * 1024 * 1024; // 2 megabytes
socket.ReceiveTimeout = 500; // half a second
byte[] incoming = BitConverter.GetBytes(1);
byte[] outgoing = BitConverter.GetBytes(1);
socket.IOControl(IOControlCode.ReceiveAll, incoming, outgoing);

После создания и настройки сокета можно использовать метод Receive () для начала приема данных. При каждом вызове Receive () возвращаемый буфер будет содержать IP-пакет. См. здесь для разбивки заголовка IPv4, здесь для заголовка UDP и здесь для заголовка TCP. Если поле Protocol заголовка IP содержит значение 17, то имеется пакет UDP.

ПРИМЕЧАНИЕ Необработанные сокеты в Windows требуют наличия администратора в локальной системе. Следующий язык содержится в статье MSDN .

Использование разъема типа SOCK_RAW требует административных привилегий. Пользователи, использующие приложения Winsock которые используют необработанные сокеты, должны быть членами группы администраторов на локальный компьютер, в противном случае необработанный сокет вызовы завершатся неуспешно с кодом ошибки WSAEACCES. В Windows Vista и более поздних версиях доступ для необработанных сокетов применяется в создание сокета. В более ранних версиях Windows, доступ для необработанных сокетов принудительно во время другого сокета операции.

-121--2681487-

Мои мысли:

  1. Вероятно, это означает «идти».
  2. Postgresql также использует\g в качестве терминатора оператора. Postgresql старше MySQL, так что это могло повлиять на них.

Но, как я указал в своем комментарии к посту Андриева выше, это на самом деле делает верхний регистр, который заставляет дисплей располагаться вертикально. Нижний регистр\g не имеет такого эффекта, или если он имеет, то в документации его не упоминается. (У меня нет установки MySQL, которую можно было бы опробовать.)

-121--1607234-

У вас есть правильная идея. Вы часто обнаружите, что у них есть пара режимов работы. Если вы беспокоитесь о том, что ваш метод не будет вызван или он не будет вызван в правильном порядке, то довольно часто существует «строгий» режим, который заставляет модельную структуру создавать исключение, если метод не вызывается к концу теста, или вызывается с неправильными параметрами и т.д.

Большинство рамок подумали о таких проблемах, поэтому вам просто нужно узнать, как настроить его для вашего сценария.

0
ответ дан 5 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: