sqlite 如何从单元测试中跳过构造函数中的数据库部分?

mkh04yzy  于 2023-05-29  发布在  SQLite
关注(0)|答案(1)|浏览(397)

我想对函数calTax()执行一个单元测试,并且不希望数据库部分出现在它的构造函数中。
由于构造函数是自动调用的,所以我得到了这个错误:
“SQLite错误1:'没有这样的表:产品_t'.”
有什么方法可以从单元测试执行中跳过构造函数调用中的数据库部分,或者避免这个错误吗?
分类代码:

//constructor
public OrderVM()
{
    using (var db = new DatabaseContext())
    {
        var list = db.Products_t.ToList();
        Products_o = new ObservableCollection<Product>(list);
    }             
}

//function I want to test
public void calTax()
{
    Tax = SubTotal * 5/ 100;
}

单元测试代码:

public class UnitTest1
{
    [Fact]
    public void Calculate_Tax()
    {
        var order = new OrderVM();
        order.SubTotal = 100;
        order.calTax();
        order.Tax.Should().Be(5);
    }
}
ev7lccsx

ev7lccsx1#

使用依赖注入或直接传入list。在任何情况下,都需要删除对DatabaseContext的依赖:

public OrderVM(List<Product> products)
{
    Products_o = new ObservableCollection<Product>(products);
}

public void calTax()
{
    Tax = SubTotal * 5/ 100;
}

然后你可以通过传递一个List<Product>来测试calTax()方法,在某些情况下,它也可能是一个空列表:

public class UnitTest1
{
    [Fact]
    public void Calculate_Tax()
    {
        var order = new OrderVM(new List<Product>());
        order.SubTotal = 100;
        order.calTax();
        order.Tax.Should().Be(5);
    }
}

如果您需要更大的灵活性,或者由于某种原因无法向OrderVM构造函数传递参数,您可能需要熟悉依赖注入(DI)和控制反转(IoC)。

相关问题