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.
任何帮助赞赏!
干杯
克里斯
你的课应该是这样的:
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)