2012-04-19 39 views
4

這是我的接口如何使用起訂量來滿足一個單元測試MEF進口的依賴?

public interface IWork 
{ 
    string GetIdentifierForItem(Information information); 
} 

和我的課

public class A : IWork 
{ 
[ImportMany] 
public IEnumerable<Lazy<IWindowType, IWindowTypeInfo>> WindowTypes { get; set; } 

public string GetIdentifierForItem(Information information) 
{ 
    string identifier = null; 
    string name = information.TargetName; 

    // Iterating through the Windowtypes 
    // searching the 'Name' and then return its ID 
    foreach (var windowType in WindowTypes) 
    { 
     if (name == windowType.Metadata.Name) 
     { 
      identifier = windowType.Metadata.UniqueID; 
      break; 
     } 
    } 
    return identifier; 
} 
} 

問題:我想單元測試方法GetIdentifierForItem

這是我想這樣做來解決這個問題 -

(1)創建一個模擬慵懶而設置,它需要在道具返回值erty得到

var windowMock = new Mock<Lazy<IWindowType, IWindowTypeInfo>>(); windowMock.Setup(foo => foo.Metadata.Name).Returns("Data"); windowMock.Setup(foo => foo.Metadata.UniqueID).Returns("someString");

(2)創建的窗口類型列表和上述嘲笑對象,然後將其設置爲所創建的一個目的

var WindowTypesList = new List<IWindowType, IWindowTypeInfo>>(); 
WindowTypesList.Add(windowMock.Object); 
A a = new A(); 
a.WindowTypes = WindowTypesList; 

(3)創建模擬信息

var InfoMock = new Mock<Information>(); 
InfoMock.Setup(foo => foo.TargetName).Returns("Data"); 

把上述所有內容放在一起作爲單元測試

[TestMethod] 
public void GetIDTest() 
{ 
    var windowMock = new Mock<Lazy<IWindowType, IWindowTypeInfo>>(); 
    windowMock.Setup(foo => foo.Metadata.Name).Returns("Data"); 
    windowMock.Setup(foo => foo.Metadata.UniqueID).Returns("someString"); 

    var WindowTypesList = new List<Lazy<IWindowType, IWindowTypeInfo>>(); 
    WindowTypesList.Add(windowMock.Object); 

    A a = new A(); 
    a.WindowTypes = WindowTypesList; 
    var InfoMock = new Mock<Information>(); 
    InfoMock.Setup(foo => foo.TargetName).Returns("Data"); 

    string expected = "someString"; // TODO: Initialize to an appropriate value 
    string actual; 
    actual = a.GetIdentifierForItem(InfoMock.Object); 
    Assert.AreEqual(expected, actual); 

} 

這個單元測試執行失敗,並拋出一個異常「TargetInvocationException」和veiwing細節,它看起來像我做的東西,我不應該做的事情。

但我不知道怎麼做的其他方式。我已閱讀Moq快速入門指南中的一些鏈接。我知道我錯過了一些東西。你能通過指導如何進行單元測試來幫助我嗎?

回答

2

你並不需要模擬Lazy<T,TMetadta>。它足夠靈活,可以與您的測試一起工作。相反,嘲笑IWindowTypeInfo

[TestMethod] 
public void GetIDTest() 
{ 
    var windowTypeInfoMock = new Mock<IWindowTypeInfo>(); 
    windowTypeInfoMock.Setup(foo => foo.Name).Returns("Data"); 
    windowTypeInfoMock.Setup(foo => foo.UniqueID).Returns("someString"); 
    var lazyWindow = 
     new Lazy<IWindowType, IWindowTypeInfo>(windowTypeInfoMock.Object); 

    var WindowTypesList = new List<Lazy<IWindowType, IWindowTypeInfo>>(); 
    WindowTypesList.Add(lazyWindow); 

    var a = new A(); 
    a.WindowTypes = WindowTypesList; 
    var InfoMock = new Mock<Information>(); 
    InfoMock.Setup(foo => foo.TargetName).Returns("Data"); 

    string expected = "someString"; 
    string actual; 
    actual = a.GetIdentifierForItem(InfoMock.Object); 
    Assert.AreEqual(expected, actual); 
} 

你的測試通過我的機器上只有小的修改,你並不需要使用組合容器進行此測試。

6

這是它可以怎樣做,設立創建CompositionContainer中,保持進口的嘲笑

1)之後。

2)添加嘲笑到容器中。

container.ComposeExportedValue(mock.Object); 

3)創建測試類的實例

4)撰寫嘲弄的進口

container.ComposeParts(instance); 
相關問題