【问题标题】:How to mock an object, declared / initialized inside a method under test?如何模拟一个对象,在被测方法中声明/初始化?
【发布时间】:2010-01-15 21:56:39
【问题描述】:

考虑这个程序

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

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

我应该如何处理列表?如果需要,我可以如何以及在哪里模拟它?

【问题讨论】:

    标签: c# unit-testing exception nunit moq


    【解决方案1】:

    由于您没有指定返回值,因此模拟项目提取器返回 null,因此访问 resultDataTable.Rows 的尝试会抛出。

    要修复错误,请在配置期望时告诉 Moq 您希望它返回什么:

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

    【讨论】:

      猜你喜欢
      • 2019-06-29
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 2016-02-02
      • 2021-06-21
      相关资源
      最近更新 更多