繁体   English   中英

BDD / TDD嘲弄数据的方法很棘手

[英]BDD/TDD mocking data the tricky way

所以一位同事和我正在进行一场相当激烈的辩论。 我们正在开始一个新项目,我们正在尝试使用BDD。 我们都是第一次参加,并不完全了解应该使用哪些做法。 我们已经编写了一些规范,现在我们正在实现代码。 由于存在大量数据库交互,因此事情变得相当棘手。 我们被困在如何模拟我们的数据上。 我们要进行的方法需要我们模拟我们的方法而不是我们的数据。 如果我在代码中向您展示,这是最简单的...

public static void AssignLeadToDistributor(int leadId, int distributorId)
{
    Lead lead = GetById(leadId);
    lead.DistributorId = distributorId;
    Save(lead);
}

基本上,我们必须覆盖GetById()和Save()以返回模拟数据,以便我们对此进行测试。 这样做似乎更有意义:

public static void AssignLeadToDistributor(Lead lead, Distributor distributor)
{
   lead.DistributorId = distirbutor.Id;
}

然后我们可以模拟我们的对象。

显然,第二种方法使测试更容易。 但是,争论的焦点是我们不希望在前端代码上获取新的前导和分发器对象,因为只传递对象的id会更容易。 减少我们前端的实际代码。

希望我解释得那么好。

你们有什么感想? 哪种方式更有意义?

我认为你遇到的最大问题是因为你正在使用公共静态函数(这在OO语言中通常是一件坏事)。

我建议将此函数移动到Lead对象,例如

public AssignDistributor(int distributorId) {
   this.DistributorId = distributorId;
   this.Save();
}

更容易测试,更像OO的代码=)

我们在BDD规范(可执行文件)中所做的就是不要模拟数据库,而是使用内存数据库(在我们的例子中是SQLite)。

此外,我们在任何场景运行之前初始化容器。 这是因为我们希望我们的BDD规格尽可能模仿现实世界,同时仍然具有普通单元测试的速度。

通过这种方式定义我们的BDD规范,我们发现单元测试和集成测试的需求减少了,并且提高了生产率和可理解性(尽管非常主观,因为你无法真正衡量这些指标)。

我更喜欢第二种方法,因为你说过:你可以轻松地模拟参数进行测试。 您使用依赖注入框架吗? 如果没有,那么我建议您使用依赖注入原则编写方法,以获得更模块化,更易于测试的代码。

我同意Samuel你需要尽可能避免使用静态方法,否则你会发现很难测试它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM