Moq MEF导入?

Chr*_*don 6 c# silverlight mef moq

我有一个A类,它有以下几点:

public class A {
    [Import(typeof(IMyService)]
    public IMyService MyService { get; set; }

    public A() {
        CompositionInitializer.SatisfyImports(this);
    }

    public void DoWork() {
        //Blah
        MyService.DoIt();
        //Blah
    }
}
Run Code Online (Sandbox Code Playgroud)

和测试这个测试(分开的Dll - 显然)

[TestMethod]
public void TestDoWork() {
    //Blah
    DoWork();
    //Assert assert
}
Run Code Online (Sandbox Code Playgroud)

这失败了,因为尝试调用'MyService'会给我null.我接着尝试过:

[ClassInitialize]
public void InitialiseClass() {
    var myService = new Mock<IMyService>();
    MyService = myService.Object;
}
Run Code Online (Sandbox Code Playgroud)

将'MyService'声明为:

[Export(typeof(IMyService))]
public IMyService MyService { get; set; }
Run Code Online (Sandbox Code Playgroud)

但仍然没有快乐,我错过了什么 - 这甚至可能吗?

我正在使用SL3,MEF Preview 9和MOQ.

任何帮助赞赏!

干杯

克里斯

Wim*_*nen 5

你的课应该是这样的:

public class A 
{
    private readonly IMyService _myService;

    [ImportingConstructor]
    public A(IMyService myService)
    {
        _myService = myService;
    }

    public void DoWork() {
        //Blah
        _myService.DoIt();
        //Blah
    }
}
Run Code Online (Sandbox Code Playgroud)

你的测试应该是这样的:

[TestMethod]
public void DoWork_invokes_IMyService_DoIt() 
{
    // arrange mock and system under test
    var myService = new Mock<IMyService>();
    var a = new A(myService.Object);

    // act    
    a.DoWork();

    // assert that DoIt() was invoked
    myService.Verify(x => x.DoIt());
}
Run Code Online (Sandbox Code Playgroud)

在单元测试中,使用MEF这一事实并不重要.MEF仅在将多个组件连接在一起时才起作用,这与单元测试中发生的情况完全相反.根据定义,单元测试是对组件进行单独测试.

编辑:如果您更喜欢属性注入,那么您的类不需要构造函数,并且单元测试中的安排部分应该如下所示:

    var myService = new Mock<IMyService>();
    var a = new A();
    a.MyService = myService.Object;
Run Code Online (Sandbox Code Playgroud)