首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >对于改进BDD/TDD的这种风格,有什么建议吗?

对于改进BDD/TDD的这种风格,有什么建议吗?
EN

Stack Overflow用户
提问于 2010-05-21 16:48:19
回答 2查看 241关注 0票数 3

我正在对我们的单元测试规范进行设置,如下所示

当行为X在场景Y中发生时的SUT规范,假设这件事和我做X时的另一件事。那它应该能做到。而且它也应该做到..。

我将GivenThat的每个步骤都封装在操作中……有没有反馈说,把动作分开是好是坏,还是让GivenThat清晰的更好方法?

代码语言:javascript
运行
AI代码解释
复制
        /// <summary>
        /// Given a product is setup for injection
        ///     And Product Image Factory Is Stubbed();
        ///     And Product Size Is Stubbed();
        ///     And Drawing Scale Is Stubbed();
        ///     And Product Type Is Stubbed();
        /// </summary>
        protected override void GivenThat()
        {
            base.GivenThat();

            Action givenThatAProductIsSetupforInjection = () =>
              {
                  var randomGenerator = new RandomGenerator();

                  this.Position = randomGenerator.Generate<Point>();

                  this.Product = new Diffuser
                                     {
                                         Size =
                                             new RectangularProductSize(
                                             2.Inches()),
                                         Position = this.Position,
                                         ProductType =
                                             Dep<IProductType>()
                                     };
              };

            Action andProductImageFactoryIsStubbed = () => Dep<IProductBitmapImageFactory>().Stub(f => f.GetInstance(Dep<IProductType>())).Return(ExpectedBitmapImage);

            Action andProductSizeIsStubbed = () =>
                 {
                     Stub<IDisplacementProduct, IProductSize>(p => p.Size);

                     var productBounds = new ProductBounds(Width.Feet(), Height.Feet());

                     Dep<IProductSize>().Stub(s => s.Bounds).Return(productBounds);
                 };

            Action andDrawingScaleIsStubbed = () => Dep<IDrawingScale>().Stub(s => s.PixelsPerFoot).Return(PixelsPerFoot);

            Action andProductTypeIsStubbed = () => Stub<IDisplacementProduct, IProductType>(p => p.ProductType);

            givenThatAProductIsSetupforInjection();
            andProductImageFactoryIsStubbed();
            andProductSizeIsStubbed();
            andDrawingScaleIsStubbed();
            andProductTypeIsStubbed();
        }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-21 17:11:11

将它们放在单独的方法中,这样您就可以在其他给定函数中组合它们。另外,使用下划线代替空格(而不是驼峰式大小写)。另外,创建一个接受Action委托参数的方法Given_that

代码语言:javascript
运行
AI代码解释
复制
protected void Given_that(params Action[] preconditions)
{
    foreach (var action in preconditions)
    {
        action();
    }
}

...

protected void a_product_is_set_up_for_injection()
{
    ...
}

protected void product_image_factory_is_stubbed()
{
    ...
}

etc...

...

Given_that(a_product_is_set_up_for_injection,
           product_image_factory_is_stubbed,
           product_size_is_stubbed,
           drawing_scale_is_stubbed,
           product_type_is_stubbed);

也就是说,我认为您的前提条件的命名不是BDD。它们本质上是非常技术性的,并不表示业务需求。如果您要告诉非程序员您正在测试什么,您可能不会说“该产品是用于注入的存根”。你更可能会说

代码语言:javascript
运行
AI代码解释
复制
Given a displacement product
    that is a two inch rectangular diffuser
    that has a random position
    that has a bitmap
    that has a size bounded by feet
    that has the expected pixels per foot

现在,您可以编写几乎不重复的“给定”方法:

代码语言:javascript
运行
AI代码解释
复制
protected [the type of your test class] Given(params Action given)
{
    given();
    return this;
}

protected void That(params Action[] preconditions)
{
    foreach (var precondition in preconditions)
    {
        precondition();
    }
}

Given(a_displacement_product)
    .That(is_a_two_inch_rectangular_diffuser,
          has_a_random_position,
          has_a_bitmap,
          has_a_size_bounded_by_feet,
          has_the_expected_pixels_per_foot);
票数 2
EN

Stack Overflow用户

发布于 2010-05-24 05:14:10

在不同的方法中组合你的GivensWhenThens是一个好主意,这就是SpecFlow (http://www.specflow.org)的方式。因此,如果想要一些自动化来创建那些无聊的重复管道,我真的会推荐使用像SpecFlow这样的工具。作为奖励,你会得到一个很好的报告工具:)

让你的代码更流畅的另一个选择是创建一个小的BDD基类。看看Jonas Follesoe在GitHub上写的BDD DSL:http://gist.github.com/406014

代码语言:javascript
运行
AI代码解释
复制
public abstract class BDD<T> where T : BDD<T>
{
    protected T Given { get { return (T)this; } }
    protected T And { get { return (T)this; } }
    protected T When { get { return (T)this; } }
    protected T Then { get { return (T)this; } }
}

正如Michael Meadows在他的伟大答案中指出的那样:如果你要用BDD的方式来做TDD (你真的应该这样做),保持专注于使你的规范对业务人员来说是可读的。这意味着:远离技术术语mock、inject、factory、exception等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2883939

复制
相关文章
Rmarkdown与Word文档的交互
在Rmarkdown中提供了直接生成Word文档格式的选项,只要在新建rmarkdown时选择Word选项就行了。
医学和生信笔记
2022/11/15
1.9K0
Rmarkdown与Word文档的交互
Swagger文档转Word 文档
GitHub 地址:https://github.com/JMCuixy/SwaggerToWord/tree/developer 一、前言     为什么会产生这个需求呢?     我们公司作为乙方,老是被客户追着要一份API文档,当我们把一个 Swagger 文档地址丢给客户的时候。客户还是很不满意,嫌不够正式!!死活坚持要一份 word 文档 。然后领导给了个接口模板,就把这个活交给我了......我去,近10个微服务,几百个接口,这不得要了我的命啊(最后整理出来将近200页的 word 文档)。最后
JMCui
2018/03/16
9K0
Swagger文档转Word 文档
HTML5 download属性无效的问题
如果url指向第三方资源,download会失效,表现和不使用download时一致——浏览器能打开的文件,浏览器会直接打开,不能打开的文件,会直接下载。浏览器打开的文件,可以手动下载。
javascript.shop
2019/09/04
5K0
Python创建分栏排版的Word文档
功能描述: 创建docx格式的Word文档,设置分栏数不同的多个节,并在每个节中写入文本。 参考代码: 运行结果:
Python小屋屋主
2020/04/01
2K0
MySQL生成word文档
链接:https://pan.baidu.com/s/16tkYaO7l42XNxUPmQi5deQ 提取码:i6mq
HaC
2020/12/30
4.2K1
MySQL生成word文档
获取pdf文档属性的方法
 当我们想在打开pdf文件之前对pdf状态进行判断时,我们可以在pdf文档属性里添加自己需要的信息,例如把pdf的有效时间和开始时间以json格式保存在作者信息里,这样就方便得多了。因此我们需要这样的第三方的类库,对pdf文档信息进行读写,在这里我推荐pdfbox和pdfclown,这两个都是java处理pdf的类库,而且开源。下面主要介绍pdfclown,而pdfbox做法差不多。        首先,我们在官网上下载pdfclown的源代码http://www.stefanochizzolini.it/
forrestlin
2018/05/23
2.1K0
新建 Microsoft Word 文档
正如我们在第4章中所了解到的,大多数组织都会提供一个可访问Internet(或Intranet,如果在防火墙后面进行测试)的网站,以向匿名用户推销组织能力、联系信息等。这些类型Web服务的一种常见部署方法是托管在非军事区(DMZ)中,非军事区是一个逻辑上或物理上独立的子网,用于公开组织面向公众的外部服务。
顾翔
2022/09/23
7K0
新建 Microsoft Word 文档
java生成word文档
定义一个工具类wordUtil: package com.keji.service.utils; import org.apache.poi.xwpf.usermodel.*; import java.io.FileInputStream; import java.io.InputStream; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.regex.Matcher; i
FHAdmin
2022/01/04
1.6K0
Android为属性组件动画无效
本来我的代码是这样的 然后发现这动画只能在窗体onCreate的时候使用有效。 放在点击事件之类的就不行了。 后经百度发现需要开始动画而不是设置动画 carImg.startAnimation(animation);
SingYi
2022/07/13
8020
Android为属性组件动画无效
python读取word文档表格里的数据
首先需要安装相应的支持库: 直接在命令行执行pip install python-docx
py3study
2020/01/03
3.8K1
text-align属性对position:absloute/fixed的元素无效
text-align属性对position:absloute/fixed的元素无效
javascript.shop
2019/09/04
1.9K0
text-align属性对position:absloute/fixed的元素无效
android:imeOptions属性详解以及无效处理
软键盘的Enter键默认显示的是“完成”文本,我们知道按Enter建表示前置工作已经准备完毕了,要去什么什么啦。比如,在一个搜索中,我们输入要搜索的文本,然后按Enter表示要去搜索了,但是默认的Enter键显示的是“完成”文本,看着不太合适,不符合搜索的语义,如果能显示“搜索”两个字或者显示一个表示搜索的图标多好。事实证明我们的想法是合理的,Android也为我们提供的这样的功能。通过设置android:imeOptions来改变默认的“完成”文本。这里举几个常用的常量值:
再见孙悟空_
2023/02/10
2.5K0
android:imeOptions属性详解以及无效处理
java解析word文档内容
今日主题:java解析word文档内容 1依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.16</version> </dependency> <dependency> <groupId>org.apache.poi</groupId>
java后端指南
2021/07/20
2.2K0
使用Python处理Word文档
1. 前言2. 使用Document对象创建文档3. 在word文档中使用标题4. 在word文档中使用段落5. 在word文档中使用列表6. 在word文档中使用表格7. 在word文档中使用章节8. 在word文档中使用分页9. 在word文档中使用图片10. 读取word文档中的内容
LogicPanda
2019/09/03
7.4K0
Java POI Word 写文档
本文通过介绍Apache POI,讲解如何使用Java代码操作Microsoft Word文档。
I Teach You 我教你
2018/01/02
2.4K0
使用 Python 操作 word文档
最近手头有一个需求是对word文档内容进行判断,搜索到一个包感觉不错,简单记录一下关键操作:
生信菜鸟团
2020/07/21
1.8K0
Word VBA技术:设置文档中表格的格式
在编辑Word文档时,经常会使用表格,也会设置表格格式,让表格看起来更美观。那么,在VBA中如何操作表格来设置其格式呢?下面介绍两段简单的代码,来学习使用代码初步设置表格的格式。
fanjy
2023/02/24
1.4K0
点击加载更多

相似问题

使用AddPicture方法word调整图像属性

11

Word表中的Shapes.AddPicture

211

编辑Word文档的属性

12

修改Word文档属性

34

追加不同的word文档,保持每个文档的属性

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文