чтобы ответить на этот вопрос,
Как установить отладку, так что вы можете пошагово ваша система под тестовым кодом?
Нет никакой конкретной настройки, которую вы должны сделать, это будет отличаться от отладки системы, запущенной из кнопки Start
в Visual Studio.
Единичный тест - это просто код, который подчеркивает public
API class
. Единственное различие между модульным тестом и фактическим вызовом публичного API - это то, что у вас есть attributes
, чтобы добавить к этому методу и что вы зависимы от mock
внутри класса. Сам класс остается таким же, как при обычной отладке, но у вас есть сценарии настройки, чтобы он обрабатывал разные логические схемы, которые затем можно было бы сделать verify
.
Чтобы получить тест бегун, чтобы запустить тест в debug
вы должны выбрать его для запуска в debug
иначе большинство бегунов по умолчанию работает в том, что в основном release
режим. В зависимости от бегуна, который вы используете, это выполняется по-другому, но чаще всего вы можете провести тест debug
и выбрать что-то вдоль линий Debug the selected Tests
.
Обращаясь к следующему вопросу,
Что я делаю неправильно? Почему он не останавливается на точке останова?
Когда вы выполняете единичный тест, как описано выше, вы тестируете фактический класс, но настраиваете сценарии, которые логическая реализация должна обрабатывать правильно.
Основная проблема заключается в том, что вы не выглядите так, как будто вы когда-либо называете метод, который вы ожидаете запустить, тест никогда не вызывает GetDeviceSettingsForSerialNumber(...)
, если это не вызвано настройкой свойства, которое вы не описали.
Что вы на самом деле сделали, это издеваться над тестируемой системой, поэтому на самом деле не тестирует реализованный код, но в основном тестирует, что moq
работает правильно. Это можно определить по этой линии:
mockDeviceInteractions.Setup(x => x.GetDeviceSettings(It.IsAny<string>(), It.IsAny<string>()));
Вы насмешливый вызов GetDeviceSettings(string, string)
, я не уверен, что на реализацию этого метода, но если метод помечен как virtual
moq
будет в фоновом режиме создания нового переопределенный метод, который будет вызываться, когда любой аргументstring
.
Вы тогда телефону:
mockDeviceInteractions.Object.GetDeviceSettings("123123", "dfgdfg");
moq
в фоновом режиме принимает этот вызов и перехватчик сопрягает это один из вызовов установки (смотри выше), это будет вызывать вызов настройки не который ни ничего не делает и ничего не возвращает.
Если метод, который вы пытаетесь проверить «GetDeviceSettingsForSerialNumber» вызывается, когда свойство (я надеюсь, что это не поле вы звоните) установлено это обнуляется при настройке свойства с вызовом:
mockDeviceInteractions.SetupSet(p => p._settingsFileQueue = It.IsAny<string>());
Я никогда не пытался этого, но я не верю, что он запустит фактический набор свойств в классе, который может быть тем, что вы ищете.
Если вы хотите настроить свойство иметь значение по умолчанию, вы в состоянии сказать:
mock.SetupProperty(f => f.Name, "foo");
Теперь я мог бы объяснить, почему я чувствую, что вы тестируете неверен, но я чувствую, что @stuartd ответ описывает, как class
должен быть структурирован в зависимости от зависимостей, которые вы можете высмеивать, чтобы возвращать данные вместо издевательских вызовов в тестируемой системе. Вместо этого я покажу вам, как я смогу структурировать ваш фактический тест со структурой, которая у вас есть сейчас.
[Test]
public void GetDeviceSettings_is_called()
{
//Arrange
var mockDeviceInteractions = new Mock<IDeviceInteractions>();
var deviceSettings = new Mock<IDeviceSettings>();
mockDeviceInteractions.Setup(x => x.GetDeviceSettings(@"123123", "dfgdfg"))
.Returns(deviceSettings.Object)
.Verifiable();
//Act
var actual = mockDeviceInteractions.Object.GetDeviceSettingsForSerialNumber(@"123123");
//Assert
Assert.Equal(deviceSettings.Object, actual);
mockDeviceInteractions.Verify();
}
Во-первых я удалил вас SetupSet
на имущество, это не требуется, если вы хотите, чтобы установить фактическое свойство просто установить его на объект, я также удалил свойство задается как я не мог посмотрите, как это соответствует вашему тесту, если вы не ожидаете, что этот метод будет вызван из средства настройки свойств, которое вы не описали.
Далее я добавил Returns
вызов метода в к вашему Setup
из GetDeviceSettings
, я не был уверен, что это возвращается, но как вы можете видеть, что это возвращает в моем примере с IDeviceSettings
и я также отметил это как Verifiable
.
Я тогда называю фактическим GetDeviceSettingsForSerialNumber
от вас. Вы никогда не называли это вообще, поэтому я не удивлен, что вы не смогли попасть в точку останова.
Наконец, я утверждаю, что возвращенный из вызова IDeviceSettings
тот же, что и метод GetDeviceSettings
. Я знаю, что это немного отличается от вашей реализации, поскольку вы возвращаете конкретный DeviceSettings
, но это должно фактически вернуть interface
.
Наконец я проверки mockDeviceInteractions
, как вы можете видеть, с Verify
вызовом, а не VerifyAll
вызова, как я иногда установки макета с вызовами, которые я делаю, не нужное хотение Verify
и только те марка, которые я хочу до Verify
с правильным вызовом метода.
Это не останавливается, потому что ** вы не используете класс 'DeviceInteractions' ** - вы используете его издеваемую версию. – stuartd
, но в этом случае я не смог бы использовать какие-либо функции moq, такие как setup и verifyall right? –
Вы могли бы использовать эти функции, так как вы создали Mock и высмеивали 'GetDeviceSettingsForSerialNumber' как этот' virtual'. В фоновом режиме «Moq» создает переопределенный метод для вас, который вы вызываете, который ничего не делает. Плюс 'VerifyAll' ничего не проверит, поскольку вы не настроили проверку. –