2015-12-06 5 views
0

В настоящее время я работаю над виртуальной машиной на основе стека, которая загружает команды из текстового файла, и мне нужно проверить действия класса Increment and Decrement. Я довольно новичок в тестировании модулей, но я работал над несколькими примерами, чтобы получить зависть от синтаксиса, но теперь я немного застрял!Единичное тестирование виртуальной машины на основе стека C#

Когда я пытаюсь запустить тесты, я получаю исключение с нулевым значением, поэтому, наверное, мой следующий вопрос: лучше ли использовать Moq или Fakes для передачи значения, чтобы проверить, соответствует ли он ожидаемому результату?

Я поглядела на фальшивки сборки и это то, что я придумал, но я не знаю, как я бы сдать экзамен по System.Collections

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

EDIT- Целочисленное значение было перенесено в стек перед вызовом этого класса.

+0

Не уверен, что я просто что-то упустил, но как вы собираетесь что-то вытащить из стека, не нажимая на него что-то? –

+0

Существует высказывание Push непосредственно после Pop, оно отлично работает с утверждением на месте, переменная называется как в классе, который я пытаюсь проверить. int op1 = (int) VirtualMachine.Stack.Pop(); VirtualMachine.Stack.Push (op1--); –

+0

Где исключение нулевого значения? Помогло бы нам быстрее выявить проблему. –

ответ

0

Похоже, вы можете получить небольшое трение, потому что проблема была слегка странной. За мои деньги я бы avoid the difficulty of mocking, переустановив вашу проблему. Например, если вы передадите стек в саму операцию, вы получите гораздо более естественный тест;

var stack = new Stack(); 
var op = new Decr(); 
stack.push(0); 
op.Execute(stack); 
Assert.AreEqual(-1, stack.Peek()); 

Вы избежали ненужного состояния на Decr класса. Это пример принципа инверсии зависимостей, в котором зависимые объекты передаются в класс, а не создаются им.

+0

Я придумал небольшую корректировку ответа, но он по-прежнему пропускает исключение нулевого объекта: var stack = new SVM.VirtualMachine.Fakes.StubIVirtualMachine(); var op = stack.StackGet(); op.Pop(); op.Push (1); Assert.AreEqual (-1, op.Peek()); –

+0

Опять же, я бы избегал заглушки - не можете ли вы пройти нормальный стек? Нет необходимости в интерфейсах, заглушках и т. Д. Кроме того, какая строка вызывает это исключение null ref? Можете ли вы подключить отладчик и выяснить, где именно? –

+0

Насколько я знаю, вы не можете, это говорит строка 13, но это начало метода. –