ʻEspec (foo) .to receive (: bar) .with (...) `vérifie les arguments [de plusieurs manières](https://relishapp.com/rspec/rspec-mocks/ v / 3-9 / docs / setting-contraintes / matching-arguments), mais il existe de nombreux cas où vous souhaitez vérifier avec des blocs.
Vous pouvez transmettre une correspondance à with, afin de pouvoir définir une correspondance personnalisée. L'exemple ci-dessous ne valide que certains attributs Struct
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
Notez que la validation des arguments par with
est effectuée pour chaque argument, donc dans le cas d'une méthode qui prend plusieurs arguments, il est nécessaire de passer matcher pour chaque argument.
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