【问题标题】:Unit Testing stack based virtual machine c#基于单元测试堆栈的虚拟机c#
【发布时间】:2015-12-06 02:21:44
【问题描述】:

我目前正在开发一个基于堆栈的虚拟机,它从文本文件加载命令,我需要测试类 Increment 和 Decrement 操作。 我对单元测试还很陌生,但我已经研究了一些示例来掌握语法,但现在我有点卡住了!

当我尝试运行测试时,我得到一个空值异常,所以我想我的下一个问题是我最好使用 Moq 或 Fakes 来传递一个值来测试它是否通过了预期的结果?

我查看了 Fakes 程序集,这是我想出的,但我不确定如何通过 System.Collections

在此之后我陷入困境,任何帮助/建设性帮助都会非常好。

EDIT- 在调用此类之前,整数值已被压入堆栈。

【问题讨论】:

  • 不确定我是否只是遗漏了一些东西,但是你怎么能期望在不先将东西压入堆栈的情况下从堆栈中弹出一些东西?
  • 在 Pop 之后直接有一个 Push 语句,它可以在适当的语句中正常工作,变量的调用就像在我要测试的类中一样。 int op1 = (int)VirtualMachine.Stack.Pop(); VirtualMachine.Stack.Push(op1--);
  • 空值异常发生在哪里?将帮助我们更快地找到问题。
  • 抱歉,当我在测试资源管理器中运行测试时,我得到这个:结果 StackTrace:在 UnitTestSVM\UnitTest1.cs 中的 UnitTestSVM.UnitTest1.DecrTest():第 17 行结果消息:测试方法 UnitTestSVM.UnitTest1 .DecrTest 抛出异常:System.NullReferenceException:对象引用未设置为对象的实例。

标签: c# unit-testing moq microsoft-fakes


【解决方案1】:

听起来你可能会遇到一点摩擦,因为这个问题的建模有点奇怪。为了我的钱,我会 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 类上出现不必要的状态。这是依赖倒置原则的一个例子,依赖对象被传递到一个类中,而不是由它创建。

【讨论】:

  • 我对你的回答做了一点调整,但它仍然传递了一个空对象异常: var stack = new SVM.VirtualMachine.Fakes.StubIVirtualMachine(); var op = stack.StackGet(); op.pop(); op.Push(1); Assert.AreEqual(-1, op.Peek());
  • 再一次,我会避免在这里使用存根——你不能传递一个普通的堆栈吗?不需要接口、存根等。另外,哪一行导致了这个 null ref 异常?你能附加一个调试器并找出它发生的确切位置吗?
  • 据我所知你不能,它说第 13 行,但那是方法的开始。
  • 对不起,这个语句发生了空异常 var stackVal = stack.StackGet();
  • 是的 - 看看新建堆栈并将其传入会更容易吗?
猜你喜欢
  • 2014-05-18
  • 2012-01-31
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 2013-01-14
  • 1970-01-01
  • 2013-09-27
相关资源
最近更新 更多