标签: bdd

如何避免贫血领域模型,或何时将方法从实体转移到服务中

我有一个常见的场景,我正在寻找一些有DDD和域建模经验的人的指导.

假设我开始构建一个博客引擎,第一个要求是在发布文章后,用户可以开始在其上发布评论.这开始很好,并导致以下设计:

public class Article
{
    public int Id { get; set; }

    public void AddComment(Comment comment)
    {
        // Add Comment
    }
}
Run Code Online (Sandbox Code Playgroud)

我的MVC控制器设计如下:

public class ArticleController
{
    private readonly IRepository _repository;

    public ArticleController(IRepository repository)
    {
        _repository = repository;
    }

    public void AddComment(int articleId, Comment comment)
    {
        var article = _repository.Get<Article>(articleId);
        article.AddComment(comment);
        _repository.Save(article);
        return RedirectToAction("Index");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在一切正常,它符合要求.下一次迭代我们得到一个要求,即每次发布评论时,博客作者都应该收到一封电子邮件通知他.

在这一点上,我有两个我能想到的选择.1)修改文章以要求IEmailService(在ctor?中)或从静态引用到我的DI容器获取EmailService

1a)看起来很难看.我相信它破坏了我的实体知道服务的一些域模型规则?

public class Article
{
    private readonly IEmailService _emailService;

    public Article(IEmailService emailService)
    {
        _emailService = emailService;
    }

    public void AddComment(Comment comment) …
Run Code Online (Sandbox Code Playgroud)

c# bdd domain-driven-design inversion-of-control

45
推荐指数
1
解决办法
2681
查看次数

使用Rspec测试完成rails json API示例

我正在寻找一个实现JSON API并包含RSpec测试的Rails 3项目的一个很好的示例存储库.一个完整的教程将是伟大的,但我会满足于一个很好的评论的例子.

api bdd json rspec ruby-on-rails

42
推荐指数
2
解决办法
2万
查看次数

我是否正确编写了我的第一个MSpec规范?

我正在编写我的第一个MSpec规范,我想要一些指导.我将规范保留在"待处理"状态,但上下文已填写完整.有什么改进吗?

作为参考,这是故事和第一个场景:

Story: "Blog admin logs in to the system"

As a blog writer
I want to be able to log in to my blog
So that I can write posts and administer my blog

Scenario: "Logs in from the login page"

Given the user enters in correct credentials for a user in the system
When the user clicks the "Login" button
Then log the user in and redirect to the admin panel with a message 
stating that he logged …
Run Code Online (Sandbox Code Playgroud)

c# bdd mspec

41
推荐指数
1
解决办法
1万
查看次数

内外BDD(带Specflow)

我是BDD的新手,但我发现它非常有趣,并希望使用BDD开发我的下一个项目.在谷歌搜索和观看截屏后,我仍然有很多关于BDD在现实生活中的问题.

1.陈述性或势在必行的场景?

我看到的大多数给定的时间场景都是用UI(命令式)编写的.

Scenario: Login
     Given I am on the Login-page
     When I enter 'AUser' in the textbox 'UserName'
       And I enter 'APassword' in the textbox 'Password'
       And I click the 'Login' button
     Then I should see the following text 'You are logged in'
Run Code Online (Sandbox Code Playgroud)

我发现这些测试非常脆弱,并且它们没有说明点击按钮的商业价值.我认为这是维持的噩梦.为什么大多数示例都使用命令性场景?

Scenario: Login (declarative)
     Given I am not logged in
     When I log in using valid credentials
     Then I should be logged in
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢声明式样式,那么如何描述"主页"或"产品页面"等内容?

2.运动UI与否?

我看到的大多数步骤实现都使用WatiN,White或类似的东西从用户的角度来实现场景.启动浏览器,单击按钮.我认为它极其缓慢而脆弱.好吧,我可以使用类似Page对象的东西来减少测试.但那是另一项工作.特别适用于具有复杂UI的桌面应用.

您如何在现实项目中实施场景 - 行使UI,或通过测试控制器/演示者?

3.真实数据库与否?

当给定部分场景时,通常需要一些数据存在于系统中(例如,一些用于商店应用的产品).您如何实现该部分 - 将数据添加到真实数据库(完整的端到端测试),或者向控制器提供存储库存根?

等待有经验的答案! …

c# bdd cucumber specflow

41
推荐指数
2
解决办法
2915
查看次数

如何在行为中看到print()语句(BDD)

上下文:我使用Python with Behave(BDD).

无论我是从命令行(行为)还是从自定义main()运行我的测试,行为都是相同的:测试运行,我在控制台中看到的唯一输出是标准BDD报告.

我的测试包括帮助我调试代码的print()语句.但是,当我运行时,控制台输出中没有显示这些打印语句.

我们有什么方法可以"行为"在我们的代码中显示print语句吗?

我的主要()

config = Configuration()
if not config.format:
    default_format = config.defaults["default_format"]
    config.format = [ default_format ]
    config.verbose = True
r = runner.Runner(config)
r.run()

if config.show_snippets and r.undefined_steps:
    print_undefined_step_snippets(r.undefined_steps)
Run Code Online (Sandbox Code Playgroud)

我的test.feature文件:

Feature: My test feature with the Behave BDD
    Scenario: A simple test
    Given you are happy
    When someone says hi
    Then you smile
Run Code Online (Sandbox Code Playgroud)

我的test_steps.py文件:

from behave import given, when, then, step, model

@given('you are happy')
def step_impl(context):
    pass

@when ('someone says {s}')
def step_impl(context, s): …
Run Code Online (Sandbox Code Playgroud)

python bdd python-behave

41
推荐指数
4
解决办法
2万
查看次数

Cuke4Nuke还是SpecFlow?

我试图决定是否应该使用Cuke4Nuke或SpecFlow.每个人的利弊是什么?关于哪个更好的观点和原因.

谢谢!

tdd bdd rspec cucumber specflow

38
推荐指数
6
解决办法
7425
查看次数

实现存储库模式的最佳方式?

我一直在探索BDD/DDD,因此试图找到Repository模式的正确实现.到目前为止,很难就实现这一点的最佳方式达成共识.我试图将其归结为以下变化,但我不确定哪种方法最好.

作为参考,我正在构建一个以NHibernate作为后端的ASP.MVC应用程序.

public interface IRepository<T> {
        // 1) Thin facade over LINQ
        T GetById(int id);
        void Add(T entity);
        void Update(T entity);
        void Remove(T entity);
        IQueryable<T> Find();
        // or possibly even
        T Get(Expression<Func<T, bool>> query);
        List<T> Find(Expression<Func<T, bool>> query);
}

public interface IRepository<T> {
        // 2) Custom methods for each query
        T GetById(int id);
        void Add(T entity);
        void Update(T entity);
        void Remove(T entity);
        IList<T> FindAll();
        IList<T> FindBySku(string sku);
        IList<T> FindByName(string name);
        IList<T> FindByPrice(decimal price);
        // ... and so on
}

public …
Run Code Online (Sandbox Code Playgroud)

c# bdd domain-driven-design repository-pattern

36
推荐指数
3
解决办法
1万
查看次数

是否有任何非开发人员工具来编辑小黄瓜文件?

Gherkin语法文件只是纯文本,因此可以使用任何编辑器,如记事本.但是,我们使用它的一个更重要的事情是提供样本数据表.没有良好的格式化选项,文件变得难以阅读.

对于visual studio,如specflow.org或https://github.com/henritersteeg/cuke4vs,有一些很好的工具(请参阅:如何在Visual Studio中为.feature文件突出显示Gherkin语法?).使用eclipse的开发人员的另一个选项在Cucumber IDE中讨论了使用自动完成功能编写功能吗?但是,我不想要求我们的业务分析师安装它.

这是一个语法高亮显示文件(http://productive.me/develop/cucumbergherkin-syntax-highlighting-for-notepad/),可以导入到notepad ++中,但它对表格格式没有任何作用.

我是否还有其他选择可以让非开发人员有效地编辑.feature小黄瓜文件?

bdd cucumber specflow gherkin

36
推荐指数
3
解决办法
2万
查看次数

如何模拟Mocha测试中的时间流逝,以便调用setTimeout回调?

我需要测试依赖于setTimeout的 JavaScript代码才能执行定期任务.我如何从我的Mocha测试中模拟时间的流逝,以便调用setTimeout回调?

我基本上要求的功能类似于Jasmine的模拟时钟,它允许你将JavaScript时间提前一些.

javascript bdd mocking mocha.js

36
推荐指数
1
解决办法
2万
查看次数

单元测试和私有变量

我正在为公共方法编写BDD单元测试.该方法更改了一个私有属性(private var),所以我想写一个expect()并确保它被正确设置.由于它是私有的,我无法弄清楚如何从单元测试目标访问它.

对于Objective-C,我只需添加一个扩展头.Swift中有类似的技巧吗?作为注释,该属性还有一个带有一些代码的didSet().

bdd unit-testing swift

36
推荐指数
1
解决办法
9413
查看次数