使用 MBUnit 根据数据库测试值

发布于 2024-08-08 13:18:08 字数 67 浏览 3 评论 0原文

我需要测试一个类,其返回值取决于数据库中的值。我可以在单元测试中访问数据库,但这些值可能会改变。对此有标准的解决方案吗?

I need to test a class who's return value depends on values from a database. I could just hit the database in the unit test but those values could change. Is there a standard solution to this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

从此见与不见 2024-08-15 13:18:08

标准答案是重新设计您的类,以便您可以模拟依赖关系。这通常是通过将数据源作为接口注入到类中来完成的。

例如,您可能有一个如下所示的类

class John 
{
     public John() { }
     public void Load()
     {
          // call to db in here e.g SQLCommand
     }                  
}

Load 依赖于 SQLCommand,因此您始终需要为此调用 db

如果您注入数据源接口,您将拥有更大的灵活性

,例如

class John 
{    IDataSource _db;
     public John(IDataSource db) 
     {
        _db = db;
     }
     public void Load()
     {
        _db.Load("John"); // IDataSource can now be either SQL 
        //or hardcoded or what ever much easier to test
     }                  
}

现在,如果您不能/不会这样做,您必须将此测试视为集成测试。你为它设置数据怎么样?例如插入您想要读取的行。然后将数据恢复到原始状态。这样做的缺点是你的测试会缓慢且脆弱。

The standard answer is to redesign you class so you can mock out the dependency. This is typically done by injecting your datasource as an interface into you class.

e.g. You may have a class that acts like below

class John 
{
     public John() { }
     public void Load()
     {
          // call to db in here e.g SQLCommand
     }                  
}

Load is dependent on the SQLCommand so you will always need to call a db for this

If you inject a datasource interface you have more flexibility

e.g.

class John 
{    IDataSource _db;
     public John(IDataSource db) 
     {
        _db = db;
     }
     public void Load()
     {
        _db.Load("John"); // IDataSource can now be either SQL 
        //or hardcoded or what ever much easier to test
     }                  
}

Now if you cannot/will not do that you must treat this test as an integration test. How about you set up data for it. e.g. insert the row you are wanting to read. Then return the data to its original state. The down side to this is that your test will be slow and brittle.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文