如何模拟一个对象,在被测方法内声明/初始化?

问题描述:

考虑这个方案如何模拟一个对象,在被测方法内声明/初始化?

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() 

我应该怎么做的列表?如果需要,我如何以及在哪里可以嘲笑这一点?

由于您没有指定返回值,因此模拟项目获取器返回null,因此尝试访问resultDataTable.Rows将引发。

要修正这个错误,告诉你Moq的希望它在配置期望返回的内容:

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