mocktail 1.1.3 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0aa187046d2e07280352ba6f0296f5573bda910acb111e06d0932f0e2518064e
4
- data.tar.gz: c3e5e74d586969ea5dd88dc86c20a9d2e6f223f1bb8a438325583a8d8fb20bae
3
+ metadata.gz: 0c303d4fb9ecc3a03e30fcfb52425cec2c4f3b2ca2ad3dadda3f9a09c1b8785a
4
+ data.tar.gz: 90b573a3b6417d1c084fa7ced22af80b0533e36c45240d42c9627b3bfde2a032
5
5
  SHA512:
6
- metadata.gz: 224a377d46c11b830b90a828e6a0c294e940c3492cde42fda9aa0f865b97cdc69773571d4464bd4bbe185aa29e6860c5a4c2b3b87a458382a84b330ddce5df3e
7
- data.tar.gz: 10562536842265afc7f6bef9fa63a8ebab657e78941f13bc0e38cb49cf8f43785d1d926d0f5afe103165d337fe2163cba88aa4aee220004c8a2494e5f5493d4c
6
+ metadata.gz: f2aa7140202bfb3d5cadc45964f344cce19ba688d807b9c25b2033d27dd15710424fc00315633129429215892ea149160d2fbba2a8671bb2237867b12ce7c225
7
+ data.tar.gz: 95f1c02d8f23849f0a5932e8cddb3f811dc01962e13e0553f1964ebf9f77489b49ce375506e3f2a5f9132bcda7493b2ffc8a03dc61dd4f5018f84fe33995245f
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ # 1.2.0
2
+
3
+ * Introduce the Mocktail.calls() API https://github.com/testdouble/mocktail/pull/16
4
+
1
5
  # 1.1.3
2
6
 
3
7
  * Improve the robustness of how we call the original methods on doubles &
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mocktail (1.1.3)
4
+ mocktail (1.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -12,7 +12,7 @@ and even safely override class methods.
12
12
 
13
13
  If you'd prefer a voice & video introduction to Mocktail aside from this README,
14
14
  you might enjoy this ⚡️[Lightning
15
- Talk](https://blog.testdouble.com/talks/2022-05-18-please-mock-me?utm_source=twitter&utm_medium=organic-social&utm_campaign=conf-talk)⚡️
15
+ Talk](https://blog.testdouble.com/talks/2022-05-18-please-mock-me?utm_source=twitter&utm_medium=organic-social&utm_campaign=conf-talk)⚡️
16
16
  from RailsConf 2022.
17
17
 
18
18
  ## An aperitif
@@ -404,6 +404,10 @@ verify { |m| auditor.record!("ok", user_id: 1) { |block| block.call.is_a?(Date)
404
404
  * `ignore_block` will similarly allow the demonstration to forego specifying a
405
405
  block, even if the actual call receives one
406
406
 
407
+ Note that if you want to verify a method _wasn't_ called at all or called a
408
+ specific number of times—especially if you don't care about the parameters, you
409
+ may want to look at the [Mocktail.calls()](#mocktailcalls) API.
410
+
407
411
  ### Mocktail.matchers
408
412
 
409
413
  You'll probably never need to call `Mocktail.matchers` directly, because it's
@@ -807,6 +811,54 @@ The `reference` object will have details of the `call` itself, an array of
807
811
  `other_stubbings` defined on the faked method, and a `backtrace` to determine
808
812
  which call site produced the unexpected `nil` value.
809
813
 
814
+ ### Mocktail.calls
815
+
816
+ When practicing test-driven development, you may want to ensure that a
817
+ dependency wasn't called at all, and don't particularly care about the
818
+ parameters. To provide a terse way to express this, Mocktail offers a top-level
819
+ `calls(double, method_name = nil)` method that returns an array of the calls to
820
+ the mock (optionally filtered to a particular method name) in the order they
821
+ were called.
822
+
823
+ Suppose you were writing a test of this method for example:
824
+
825
+ ```ruby
826
+ def import_users
827
+ users_response = @gets_users.get
828
+ if users_response.success?
829
+ @upserts_users.upsert(users_response.data)
830
+ end
831
+ end
832
+ ```
833
+
834
+ A test case of the negative branch of that `if` statement (when `success?` is
835
+ false) might simply want to assert that `@upserts_users.upsert` wasn't called at
836
+ all, regardless of its parameters.
837
+
838
+ The easiest way to do this is to use `Mocktail.calls()` method, which is an
839
+ alias of [Mocktail.explain(double).reference.calls](#mocktailexplain) that can
840
+ filter to a specific method name. In the case of a test of the above method, you
841
+ could assert:
842
+
843
+ ```ruby
844
+ # Assert that the `upsert` method on the mock was never called
845
+ assert_equal 0, Mocktail.calls(@upserts_users, :upsert).size
846
+
847
+ # Assert that NO METHODS on the mock were called at all:
848
+ assert_equal 0, Mocktail.calls(@upserts_users).size
849
+ ```
850
+
851
+ If you're interested in doing more complicated introspection in the nature of
852
+ the calls, their ordering, and so forth, the `calls` method will return
853
+ `Mocktail::Call` values with the args, kwargs, block, and information about the
854
+ original class and method being mocked.
855
+
856
+ (While this behavior can technically be accomplished with `verify(times: 0) { …
857
+ }`, it's verbose and error prone to do so. Because `verify` is careful to only
858
+ assert exact argument matches, it can get pretty confusing to remember to tack
859
+ on `ignore_extra_args: true` and to call the method with zero args to cover all
860
+ cases.)
861
+
810
862
  ### Mocktail.reset
811
863
 
812
864
  This one's simple: you probably want to call `Mocktail.reset` after each test,
data/bin/rake ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rake' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("rake", "rake")
@@ -0,0 +1,13 @@
1
+ module Mocktail
2
+ class CollectsCalls
3
+ def collect(double, method_name)
4
+ calls = ExplainsThing.new.explain(double).reference.calls
5
+
6
+ if method_name.nil?
7
+ calls
8
+ else
9
+ calls.select { |call| call.method.to_s == method_name.to_s }
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  module Mocktail
2
- VERSION = "1.1.3"
2
+ VERSION = "1.2.0"
3
3
  end
data/lib/mocktail.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require_relative "mocktail/collects_calls"
1
2
  require_relative "mocktail/debug"
2
3
  require_relative "mocktail/dsl"
3
4
  require_relative "mocktail/errors"
@@ -67,6 +68,13 @@ module Mocktail
67
68
  ExplainsNils.new.explain
68
69
  end
69
70
 
71
+ # An alias for Mocktail.explain(double).reference.calls
72
+ # Takes an optional second parameter of the method name to filter only
73
+ # calls to that method
74
+ def self.calls(double, method_name = nil)
75
+ CollectsCalls.new.collect(double, method_name)
76
+ end
77
+
70
78
  # Stores most transactional state about calls & stubbing configurations
71
79
  # Anything returned by this is undocumented and could change at any time, so
72
80
  # don't commit code that relies on it!
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mocktail
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Searls
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-06-28 00:00:00.000000000 Z
11
+ date: 2022-09-21 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -27,8 +27,10 @@ files:
27
27
  - README.md
28
28
  - Rakefile
29
29
  - bin/console
30
+ - bin/rake
30
31
  - bin/setup
31
32
  - lib/mocktail.rb
33
+ - lib/mocktail/collects_calls.rb
32
34
  - lib/mocktail/debug.rb
33
35
  - lib/mocktail/dsl.rb
34
36
  - lib/mocktail/errors.rb
@@ -119,7 +121,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
119
121
  - !ruby/object:Gem::Version
120
122
  version: '0'
121
123
  requirements: []
122
- rubygems_version: 3.3.7
124
+ rubygems_version: 3.3.20
123
125
  signing_key:
124
126
  specification_version: 4
125
127
  summary: Take your objects, and make them a double