NUnit的/起订量:我曾经嘲笑的一类,但实际执行构造器,为什么呢?(NUnit/Moq: I ha

2019-09-30 08:05发布

我有我现在试图让单元NUnit的(第2.6.3)和起订量测试了大笔遗产WPF项目(V 4.2),但我有与嘲讽某些种类的麻烦。 还有一个特别,衍生控制类System.Windows.Forms.Integration.WindowsFormsHost ,这需要各地的项目,有很多外部依赖的,这样一来就能嘲笑它是非常重要的。

让我们把这个类Foo ,这里的测试用例:

[TestFixture,RequiresSTA]
public class TestMainWindowViewModel {
    [Test]
    public void Test1() {
        var mockRepository = new MockRepository(MockBehavior.Loose) { DefaultValue = DefaultValue.Empty };
        var mockFoo = mockRepository.Create<Foo>();
        var sut = new MainWindowViewModel(mockFoo.Object);
    }
}

我的问题是,由于某种奇怪的原因,同时评估参数mockFoo.Object在最后一行,我们直奔混凝土类的构造函数中Foo ! 我已经确认这真的发生了调试器,而且,试运行与没有找到的错误DLL的具体实施取决于崩溃。

任何想法可能是造成这个? 据我了解,应该是这里的具体实施无连接!

在此先感谢您的任何建议!

-Seppo

Answer 1:

任何想法可能是造成这个? 据我了解,应该是这里的具体实施无连接!

起订量由具体的实现(你的情况) 获得或实现接口(典型,更常见的情况)创建的对象( 嘲笑 ):

// implement interface
var mock1 = new Mock<IService>();
// derive from ServiceImplementation
var mock2 = new Mock<ServiceImplementation>();

这是基本的机制如何工作-为了创建模拟 ,起订量必须动态地创建新的类型表示嘲笑,无论是通过实现接口或基类派生。 这意味着你Foo构造应该和执行。 这是如何工作的。

由于这是遗留代码类( Foo ),我建议用新的,mockable接口包裹它,使你的代码依赖于该接口而不是在:

interface IFoo
{
    void DoFoo();
}

class FooWrapper : IFoo
{
    private readonly Foo legacyFoo;

    public FooWrapper(Foo legacyFoo)
    {
       this.legacyFoo = legacyFoo;
    }

   public void DoFoo()
   { 
      legacyFoo.DoFoo();
   }
}

您的新(非遗留)代码应取决于IFoo的,而不是foo,你会好到哪里去。



文章来源: NUnit/Moq: I have mocked a class but real contructor is executed, why?