#spec
let(:price) { create :price,:some_trait,:my_trait }
#factory
FactoryGirl.define do
factory :price, class: 'Prices::Price' do
...
after(:build) do |p,e|
# How I can get the traits passed to the create method?
# => [:some_trait,:my_trait]
if called_traits_does_not_include(:my_trait) # fake code
build :price_cost,:order_from, price:p
end
end
...
end
end
Run Code Online (Sandbox Code Playgroud)
我如何获得create在工厂after(:build)回调中传递的特征?
SBT 支持开箱即用的连续测试。我如何将其集成到 IntelliJ 中,以便 IntelliJ 向我显示失败的测试(类似于 .NET 的精彩 NCrunch)?
我得到了两个匹配器,它们的名称相同:
RSpec::Matchers.define :be_the_downcased_version_of do |actual|
match do |actual|
@actual = actual
@expected = expected
@actual == @expected.downcase
end
failure_message do |actual|
"Expected #{@actual.inspect} to be the downcased version of #{expected.inspect}.\nIt was not: #{@actual.inspect}"
end
failure_message_when_negated do |actual|
"Expected #{@actual.inspect} to not be the downcased version of #{expected.inspect}.\nIt was: #{@actual.inspect}"
end
description do
"be the downcased version of #{expected.inspect}"
end
end
RSpec::Matchers.define :return_the_downcased_version_of do |actual|
match do |actual|
@actual = actual
@expected = expected
@actual == @expected.downcase
end
failure_message do |actual| …Run Code Online (Sandbox Code Playgroud) 我想访问命令行中传递的标记过滤器
命令行
rspec --tag use_ff
Run Code Online (Sandbox Code Playgroud)
RSpec配置
RSpec.configure do |config|
config.before :suite, type: :feature do
# how do I check if use_ff filter was specified in the command line?
if filter[:use_ff]
use_selenium
else
use_poltergeist
end
end
end
Run Code Online (Sandbox Code Playgroud)
在before(:suite)钩子中,我想访问配置中命令行中指定的标记过滤器.
根据rspec的核心代码库包含标记过滤器被存储在inclusion_filter RSpec.configuration的.从理论上讲,我应该能够按如下方式访问它们:
RSpec.configure do |config|
config.before :suite, type: :feature do
if config.filter[:use_ff] # filter is an alias for inclusion_filter
use_selenium
else
use_poltergeist
end
end
end
Run Code Online (Sandbox Code Playgroud)
但是,出于某种原因,即使从命令行传递标记,我也会得到一个空哈希.
我了解了Flyweight设计模式,并了解它存储了可以共享的对象,从而节省了堆的使用。Java缓存还保存了以后可以重用的对象,以节省内存。那么Flyweight设计模式和Java缓存之间的真正区别是什么?
如果我希望我的代码遵循SOLID原则,特别是依赖性反转原则,这是否意味着我必须为每个模块创建一个接口(抽象),即使它只有一个实现?
在我看来,并根据这些帖子:
http://josdejong.com/blog/2015/01/06/code-reuse/
http://blog.ploeh.dk/2010/12/02/Interfacesarenotabstractions/
为每个模块创建"抽象"是代码混乱并违反了YAGNI原则.
我的经验法则是:不要使用依赖注入,或者为模块创建接口,除非它有多个实现(第二个实现可以是用于数据库/服务器/文件模块的单元测试的模拟类).
有人可以为我清楚这一点吗?SOLID是否意味着我必须注入每个模块并对其进行抽象?如果是的话,是不是只是在很多时候我们根本不会使用它?
architecture dependency-injection solid-principles dependency-inversion
我正在学校参加设计模式课程,并阅读了Head First Design Patterns的一些章节.我想知道的是设计模式在多大程度上可以防止重写现有代码.
我们以Duck课程和FlyBehavior课程为例.我有public static void main(String[] args)以下代码:
Duck mallard = new MallardDuck(new FlyWithWings());
Run Code Online (Sandbox Code Playgroud)
我是否正确地说,main()当您想要添加新策略时,您不得不修改方法?这样,您正在修改现有代码,对吧?我特别指的是提到具体策略类的部分:new FlyWithWings().
如果在代码中实现了工厂方法模式,则可能会阻止具体的类(FlyWithWings)被提及:
public FlyBehavior returnBehavior(FlyBehaviorFactory factory, String behaviorType) {
return factory.getFlyBehavior(behaviorType);
}
Run Code Online (Sandbox Code Playgroud)
因此,请使用以下代码行:
Duck mallard = new MallardDuck(returnBehavior(flyFactory, "wings"));
Run Code Online (Sandbox Code Playgroud)
这样,程序的某个部分不必知道要使用的FlyBehaviorFactory.但是,您的main()方法仍然需要在returnBehavior方法中指定某些参数,以便了解哪个工厂将创建什么策略.因此,我是否正确地说,main()如果我添加了一个新的FlyBehavior类,你仍然需要修改,并希望将其作为参数添加到returnBehavior()?
可以进一步改善这种情况吗?
我正在使用rspec-mock进行测试驱动开发.我开始实现一个单独的类,并使用rspec-mock来模拟/存根其他类.模拟尚未实现的类的对象效果很好.但是,当我尝试模拟一个尚不存在的类的类方法时,我还没有成功.我的类"Hashes"应该有一个类方法"calculate_hashes"接收文件名并返回一个哈希值.
我试过了
allow(Hashes).to receive(:calculate_hash) do |file|
# looks up what to return
end
Run Code Online (Sandbox Code Playgroud)
这给出了错误"哈希不是一个类".然后我实施了一个类"哈希"
class Hashes
end
Run Code Online (Sandbox Code Playgroud)
然后只尝试以相同的方式存根类方法.这给出了错误"Hashes没有实现:calculate_hash"当我然后将方法添加到我的类定义时:
class Hashes
def self.calculate_hash(filename)
end
end
Run Code Online (Sandbox Code Playgroud)
它最终工作,我的这个类方法的存根使用"allow(Hashes)"工作,如上例所示.我只是想知道是否有办法在不编写这个类骨架的情况下完成这个.
或者我可能试图以不恰当的方式完成某些事情?或者rspec-mock可能不是正确的工具呢?
任何帮助是极大的赞赏.
我使用Cucumber与Gherkin语法.
我想在组合框中只显示相关的步骤名称.我知道我需要做的"离线"工作.
我的问题是,是否可以选择哪些步骤名称将进入组合框?(而不是所有步骤名称)
看图像:
提前致谢.
我真的不明白单元测试中模式的排列部分和行为部分之间的区别。仅排列是否意味着对象的创建?我们为什么要首先将 Arrange 与 Act 部分分开,以及判断某个东西是否属于 Act 部分而不属于 Arrange 部分的标准是什么?在我看来,一切都属于安排部分,因为我们为断言“安排测试”,不是吗?
rspec ×4
ruby ×4
java ×2
unit-testing ×2
architecture ×1
automation ×1
caching ×1
cucumber ×1
factory ×1
factory-bot ×1
gherkin ×1
methods ×1
mocking ×1
rspec-mocks ×1
sbt ×1
tdd ×1
testing ×1