代码之家  ›  专栏  ›  技术社区  ›  Adam

使用MOQ模拟数据集

moq
  •  7
  • Adam  · 技术社区  · 15 年前

    我正在努力开始进行能源部的工作,并且很难找到任何好的资源来满足我的需要。

    我有一个数据接口类,它有一个get方法,该方法通过存储过程返回数据集。这就是代码的编写方式,目前我不能更改它,所以必须这样做。

    我想通过模拟数据集并返回数据来测试这个类,这样我就不必实际地进行数据库调用。

    有人这样做吗?如果有,从哪里开始做呢?

    2 回复  |  直到 6 年前
        1
  •  7
  •   Roger Lipscombe    15 年前

    您不需要数据库连接来填充数据集。你可以这样模仿它:

    IDataInterface di = new Mock<IDataInterface>();
    DataSet mockDataSet = CreateMockDataSet();
    di.Expect(x => x.Get()).Returns(mockDataSet);
    something.UseDataInterface(di.Object);
    

    不过,填充模拟数据集是非常痛苦的。如果我这样做,我通常会在返回的数据集前面放置一个facade接口,这更容易被模仿。或者我将代码更改为使用数据表,这样更容易填写。

    或者,为单元测试使用嵌入式数据库,如sqlite或SQL Server CE。

        2
  •  0
  •   Alexxus    6 年前

    我也面临着上述问题,并提出了这个解决方案。我分享它是因为我在谷歌上找不到任何相关信息:

    [TestCategory("GetDataSet")]
    [TestMethod]
    public void GetDataSet_ValidCall_ShouldPass()
    {
        // Arrange
    
        var dataSet = Builder<DataSet>.CreateNew().Build();
    
        DataTable table1 = new DataTable();
        table1.Columns.Add("Id", typeof(int));
        table1.Columns.Add("Name", typeof(string));
        table1.Rows.Add("1", "Name1");
    
        DataTable table2 = new DataTable();
        table2.Columns.Add("More", typeof(bool));
        table2.Rows.Add(false);    
    
        dataSet.Tables.Add(table1);
        dataSet.Tables.Add(table2);
    
        objectWhichHaveProcMethod.Setup(elem => elem.ExecuteProcAndGetDataSet("YourSprocName", It.IsAny<SqlParameter>(), It.IsAny<SqlParameter>())).Returns(dataSet);
    
        // Act
        var response = dataInterfaceClass.Get();
    
        // Assert  
        Assert.AreNotEqual(response, null);
    }