Skip to content

Commit fc14567

Browse files
committed
Improve failure messages when not expecting a list
1 parent 50a38c7 commit fc14567

File tree

3 files changed

+33
-20
lines changed

3 files changed

+33
-20
lines changed

lib/rspec/sql.rb

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,21 @@ module Sql; end
1515
match do |block|
1616
@queries = scribe_queries(&block)
1717
@matcher = Sql::QueryMatcher.new(@queries, expected)
18+
expected = matcher.expected
1819

1920
matcher.matches?
2021
end
2122

2223
failure_message do |_block|
23-
if expected.is_a?(Enumerator) && expected.inspect.match?(/:times>$/)
24-
expected = expected.size
24+
if expected.nil?
25+
return "Expected at least one database query but observed none."
2526
end
2627

2728
<<~MESSAGE
2829
Expected database queries: #{expected}
29-
Actual database queries: #{query_names}
30+
Actual database queries: #{matcher.actual}
3031
31-
Diff: #{Expectations.differ.diff_as_object(query_names, expected)}
32+
Diff: #{Expectations.differ.diff_as_object(matcher.actual, expected)}
3233
3334
Full query log:
3435
@@ -48,10 +49,6 @@ def supports_block_expectations?
4849
true
4950
end
5051

51-
def query_names
52-
@queries.map { |q| q[:name] || q[:sql].split.take(2).join(" ") }
53-
end
54-
5552
def query_descriptions
5653
@queries.map { |q| "#{q[:name]} #{q[:sql]}" }
5754
end

lib/rspec/sql/query_matcher.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ module RSpec
66
module Sql
77
# Compares expectations with actual queries.
88
class QueryMatcher
9+
attr_reader :expected
10+
911
def initialize(queries, expected)
1012
@queries = queries
1113
@expected = sanitize_number(expected)
@@ -18,9 +20,11 @@ def matches?
1820
actual == expected
1921
end
2022

21-
private
23+
def actual
24+
@actual ||= actual_compared_to_expected
25+
end
2226

23-
attr_reader :expected
27+
private
2428

2529
# Support writing: `is_expected.to query_database 5.times`
2630
def sanitize_number(expected)
@@ -31,10 +35,6 @@ def sanitize_number(expected)
3135
end
3236
end
3337

34-
def actual
35-
@actual ||= actual_compared_to_expected
36-
end
37-
3838
def actual_compared_to_expected
3939
case expected
4040
when Integer

spec/lib/rspec/sql_spec.rb

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,16 +67,32 @@
6767
)
6868
end
6969

70+
it "prints user-friendly message expecting nothing" do
71+
message = error_message { expect { User.last }.not_to query_database }
72+
expect(message).to eq <<~TXT
73+
Expected no database queries but observed:
74+
75+
User Load SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT ?
76+
TXT
77+
end
78+
79+
it "prints user-friendly message expecting something" do
80+
message = error_message { expect { nil }.to query_database }
81+
expect(message).to eq(
82+
"Expected at least one database query but observed none."
83+
)
84+
end
85+
7086
it "prints user-friendly message expecting a number" do
7187
message = error_message { expect { User.last }.to query_database 2 }
7288
expect(message).to eq <<~TXT
7389
Expected database queries: 2
74-
Actual database queries: ["User Load"]
90+
Actual database queries: 1
7591
7692
Diff:
7793
@@ -1 +1 @@
7894
-2
79-
+["User Load"]
95+
+1
8096
8197
8298
Full query log:
@@ -89,12 +105,12 @@
89105
message = error_message { expect { User.last }.to query_database 2.times }
90106
expect(message).to eq <<~TXT
91107
Expected database queries: 2
92-
Actual database queries: ["User Load"]
108+
Actual database queries: 1
93109
94110
Diff:
95111
@@ -1 +1 @@
96112
-2
97-
+["User Load"]
113+
+1
98114
99115
100116
Full query log:
@@ -134,12 +150,12 @@
134150
# This message could be better but nobody has asked for it yet.
135151
expect(message).to eq <<~TXT
136152
Expected database queries: {:update=>{:user=>1}}
137-
Actual database queries: ["User Load"]
153+
Actual database queries: {:select=>{:users=>1}}
138154
139155
Diff:
140156
@@ -1 +1 @@
141157
-:update => {:user=>1},
142-
+["User Load"]
158+
+:select => {:users=>1},
143159
144160
145161
Full query log:

0 commit comments

Comments
 (0)