Mit "erwarten (foo) .zu empfangen (: bar) .mit (...)" von RSpec können Sie Argumente [auf verschiedene Arten] überprüfen (https://relishapp.com/rspec/rspec-mocks/). v / 3-9 / docs / einstellungsbeschränkungen / übereinstimmende Argumente), aber es gibt einige Fälle, in denen Sie mit Blöcken überprüfen möchten.
Sie können einen Matcher an with übergeben, um einen benutzerdefinierten Matcher zu definieren. Im folgenden Beispiel werden nur bestimmte Strukturattribute überprüft
RSpec::Matchers.define :a_valid_argument do
match {|actual| block_arg.call(actual) }
end
it "should call with valid argument" do
jon = Struct.new(:name).new("Jon")
expect($stdout).to receive(:write).with(
a_valid_argument {|a| a.name == "Jon" },
)
$stdout.write(jon)
end
Beachten Sie, dass die Argumentvalidierung durch "with" für jedes Argument durchgeführt wird. Bei einer Methode, die mehrere Argumente akzeptiert, muss für jedes Argument ein Matcher übergeben werden.
it "should call with valid arguments" do
jon = Struct.new(:name).new("Jon")
dany = Struct.new(:name).new("Dany")
expect($stdout).to receive(:write).with(
a_valid_argument {|a| a.name == "Jon" },
a_valid_argument {|a| a.name == "Dany" },
)
$stdout.write(jon, dany)
end
Recommended Posts