2010-01-15 51 views
1

考慮這個方案如何模擬一個對象,在被測方法內聲明/初始化?

public class ItemManager 
{ 
    private ItemFetcher itemFetcher; 
    public ItemManager(ItemFetcher _itemFetcher) 
    { 
     itemFetcher = _itemFetcher; 
    } 
    public List<Item> GetItemsFomTable() 
    { 
     List<Item> itemsList = new List<Item>(); 
     Item item; 

     DataTable resultDataTable = itemFetcher.GetItemsFromDB(); 

     foreach (DataRow row in resultDataTable.Rows) 
     { 
      item = new Item(); 
      // set item's name property 
      // set item's price property 
      itemsList.Add(item); 
     } 
     return itemsList; 
    } 
} 
public class Item 
{ 
    string name; 

    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 
    double price; 

    public double Price 
    { 
     get { return price; } 
     set { price = value; } 
    } 
} 
public class ItemFetcher 
{ 
    public virtual DataTable GetItemsFromDB() 
    { 
     // DoSomething and fetch records in DataTable and return 
     return new DataTable(); 
    } 
} 

我想測試itemFetcher.GetItemsFromDB方法的類ItemManager的方法「GetItemsFomTable()」被調用一次。下面是測試

[TestFixture] 
    public class ItemManagerTester 
    {   
     [SetUp] 
     public void Init() 
     { 

     } 
     [Test] 
     public void TestForGetItemsFomTable() 
     { 
      var mockItemFetcher = new Mock<ItemFetcher>(); 
      var itemManager = new ItemManager(mockItemFetcher.Object); 

      mockItemFetcher.Setup(x => x.GetItemsFromDB()); 
      itemManager.GetItemsFomTable(); 

      mockItemFetcher.VerifyAll(); 
     } 
    } 

正如你可以看到有方法內初始化列表下測試

List<Item> itemsList = new List<Item>(); 

我得到這個例外提出:

TestCase 'MockingSample.ItemManagerTester.TestForGetItemsFomTable' 
failed: System.NullReferenceException : Object reference not set to an instance of an object. 
    ItemManager.cs(26,0): at MockingSample.ItemManager.GetItemsFomTable() 
    ItemManager.cs(77,0): at MockingSample.ItemManagerTester.TestForGetItemsFomTable() 

我應該怎麼做的列表?如果需要,我如何以及在哪裏可以嘲笑這一點?

回答

1

由於您沒有指定返回值,因此模擬項目獲取器返回null,因此嘗試訪問resultDataTable.Rows將引發。

要修正這個錯誤,告訴你Moq的希望它在配置期望返回的內容:

mockItemFetcher.Setup(x => x.GetItemsFromDB()).Returns(new DataTable());