我正在使用Moq(我和TDD期间一样非常新)。我想要Moq我的主要Winforms表单的实例,所以我可以在那里测试一些方法。这可能吗?它的构造函数接受Assembly()的对象。
我正在尝试以下尝试失败:
var mockMainForm = new Mock<MainForm>();
mockMainForm.Setup(x => x.Assembler).Returns(new Assembly());
return mockMainForm.Object;
但是一旦返回,我就无法访问该对象的任何属性或方法。这可能吗?
但我收到错误(失败:System.ArgumentException:Expression不是方法调用:x =&gt; x.Assembler 在Moq.ExpressionExtensions.ToMethodCall(LambdaExpression表达式))
答案 0 :(得分:2)
使用Moq进行模拟只会模拟类的接口和虚方法。 Assembler
属性需要定义为virtual
。
在任何情况下,模拟Windows窗体都不是一个好的嘲弄 - 它有一大包WIN32的东西,使你的测试变得脆弱。如果需要单元测试并模拟表单,请创建表单需要实现的接口,并模拟需要与表单交互的对象。
public interface IHasAssembler
{
Foo Assembler {get; set;}
}
public class MyForm : IHasAssembler
{
//
}
然后模拟界面而不是表单:
Mock<IHasAssembler> myMock = new Mock<IHasAssembler>();
答案 1 :(得分:0)
我从未使用(或者确实听说过)Moq,但我猜测mockMainForm.Object
类型为Form
,并且您可以投射以获取它:< / p>
object moqObject = MakeMoqOfMyMainForm();
Form mainForm = (Form)moqObject;
(如果我错了,请告诉我,我会删除此答案)