jasmine 1.2.0 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +1 -0
- data/.travis.yml +1 -0
- data/Gemfile +1 -8
- data/RELEASE_NOTES.markdown +6 -0
- data/lib/jasmine.rb +8 -2
- data/lib/jasmine/application.rb +40 -0
- data/lib/jasmine/asset_pipeline_mapper.rb +20 -0
- data/lib/jasmine/base.rb +1 -1
- data/lib/jasmine/config.rb +12 -73
- data/lib/jasmine/dependencies.rb +4 -0
- data/lib/jasmine/page.rb +1 -1
- data/lib/jasmine/results.rb +19 -0
- data/lib/jasmine/results_processor.rb +37 -0
- data/lib/jasmine/rspec_formatter.rb +92 -0
- data/lib/jasmine/run.html.erb +1 -0
- data/lib/jasmine/run_specs.rb +33 -0
- data/lib/jasmine/runner_config.rb +60 -0
- data/lib/jasmine/runners/http.rb +70 -0
- data/lib/jasmine/selenium_driver.rb +0 -14
- data/lib/jasmine/server.rb +14 -35
- data/lib/jasmine/tasks/jasmine.rake +2 -2
- data/lib/jasmine/version.rb +1 -1
- data/lib/rack/jasmine/focused_suite.rb +3 -3
- data/spec/application_spec.rb +99 -0
- data/spec/asset_pipeline_mapper_spec.rb +18 -0
- data/spec/config_spec.rb +32 -67
- data/spec/dependencies_spec.rb +14 -3
- data/spec/jasmine_self_test_spec.rb +16 -16
- data/spec/page_spec.rb +1 -1
- data/spec/results_processor_spec.rb +3 -0
- data/spec/results_spec.rb +27 -0
- data/spec/rspec_formatter_spec.rb +88 -0
- data/spec/runner_config_spec.rb +131 -0
- data/spec/server_spec.rb +34 -81
- metadata +44 -24
- data/lib/jasmine/runner.rb +0 -32
- data/lib/jasmine/spec_builder.rb +0 -162
@@ -0,0 +1,60 @@
|
|
1
|
+
module Jasmine
|
2
|
+
class RunnerConfig
|
3
|
+
def initialize(config = Jasmine::Config.new)
|
4
|
+
@config = config
|
5
|
+
end
|
6
|
+
|
7
|
+
def css_files
|
8
|
+
@config.jasmine_stylesheets + @config.user_stylesheets
|
9
|
+
end
|
10
|
+
|
11
|
+
def jasmine_files
|
12
|
+
@config.jasmine_javascripts
|
13
|
+
end
|
14
|
+
|
15
|
+
def js_files
|
16
|
+
@config.js_files
|
17
|
+
end
|
18
|
+
|
19
|
+
def spec_files
|
20
|
+
@config.spec_files
|
21
|
+
end
|
22
|
+
|
23
|
+
def spec_files_full_paths
|
24
|
+
@config.spec_files_full_paths
|
25
|
+
end
|
26
|
+
|
27
|
+
def spec_path
|
28
|
+
@config.spec_path
|
29
|
+
end
|
30
|
+
|
31
|
+
def spec_dir
|
32
|
+
@config.spec_dir
|
33
|
+
end
|
34
|
+
|
35
|
+
def src_dir
|
36
|
+
@config.src_dir
|
37
|
+
end
|
38
|
+
|
39
|
+
def project_root
|
40
|
+
@config.project_root
|
41
|
+
end
|
42
|
+
|
43
|
+
def root_path
|
44
|
+
@config.root_path
|
45
|
+
end
|
46
|
+
|
47
|
+
def browser
|
48
|
+
ENV["JASMINE_BROWSER"] || 'firefox'
|
49
|
+
end
|
50
|
+
|
51
|
+
def jasmine_host
|
52
|
+
ENV["JASMINE_HOST"] || 'http://localhost'
|
53
|
+
end
|
54
|
+
|
55
|
+
def port
|
56
|
+
@port ||= ENV["JASMINE_PORT"] || Jasmine.find_unused_port
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Jasmine
|
2
|
+
module Runners
|
3
|
+
class HTTP
|
4
|
+
attr_accessor :suites
|
5
|
+
|
6
|
+
def initialize(client, results_processor)
|
7
|
+
@client = client
|
8
|
+
@results_processor = results_processor
|
9
|
+
end
|
10
|
+
|
11
|
+
def run
|
12
|
+
@client.connect
|
13
|
+
load_suite_info
|
14
|
+
wait_for_suites_to_finish_running
|
15
|
+
results = @results_processor.process(results_hash, suites)
|
16
|
+
@client.disconnect
|
17
|
+
results
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def load_suite_info
|
23
|
+
started = Time.now
|
24
|
+
while !eval_js('return jsApiReporter && jsApiReporter.started') do
|
25
|
+
raise "couldn't connect to Jasmine after 60 seconds" if (started + 60 < Time.now)
|
26
|
+
sleep 0.1
|
27
|
+
end
|
28
|
+
|
29
|
+
@suites = eval_js("var result = jsApiReporter.suites(); if (window.Prototype && Object.toJSON) { return Object.toJSON(result) } else { return JSON.stringify(result) }")
|
30
|
+
end
|
31
|
+
|
32
|
+
def results_hash
|
33
|
+
spec_results = {}
|
34
|
+
spec_ids.each_slice(50) do |slice|
|
35
|
+
spec_results.merge!(eval_js("var result = jsApiReporter.resultsForSpecs(#{json_generate(slice)}); if (window.Prototype && Object.toJSON) { return Object.toJSON(result) } else { return JSON.stringify(result) }"))
|
36
|
+
end
|
37
|
+
spec_results
|
38
|
+
end
|
39
|
+
|
40
|
+
def spec_ids
|
41
|
+
map_spec_ids = lambda do |suites|
|
42
|
+
suites.map do |suite_or_spec|
|
43
|
+
if suite_or_spec['type'] == 'spec'
|
44
|
+
suite_or_spec['id']
|
45
|
+
else
|
46
|
+
map_spec_ids.call(suite_or_spec['children'])
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
map_spec_ids.call(@suites).compact.flatten
|
51
|
+
end
|
52
|
+
|
53
|
+
def wait_for_suites_to_finish_running
|
54
|
+
puts "Waiting for suite to finish in browser ..."
|
55
|
+
while !eval_js('return jsApiReporter.finished') do
|
56
|
+
sleep 0.1
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def eval_js(script)
|
61
|
+
@client.eval_js(script)
|
62
|
+
end
|
63
|
+
|
64
|
+
def json_generate(obj)
|
65
|
+
@client.json_generate(obj)
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -21,10 +21,6 @@ module Jasmine
|
|
21
21
|
@http_address = http_address
|
22
22
|
end
|
23
23
|
|
24
|
-
def tests_have_finished?
|
25
|
-
@driver.execute_script("return window.jasmine.getEnv().currentRunner.finished") == "true"
|
26
|
-
end
|
27
|
-
|
28
24
|
def connect
|
29
25
|
@driver.navigate.to @http_address
|
30
26
|
end
|
@@ -33,16 +29,6 @@ module Jasmine
|
|
33
29
|
@driver.quit
|
34
30
|
end
|
35
31
|
|
36
|
-
def run
|
37
|
-
until tests_have_finished? do
|
38
|
-
sleep 0.1
|
39
|
-
end
|
40
|
-
|
41
|
-
puts @driver.execute_script("return window.results()")
|
42
|
-
failed_count = @driver.execute_script("return window.jasmine.getEnv().currentRunner.results().failedCount").to_i
|
43
|
-
failed_count == 0
|
44
|
-
end
|
45
|
-
|
46
32
|
def eval_js(script)
|
47
33
|
result = @driver.execute_script(script)
|
48
34
|
JSON.parse("{\"result\":#{result}}", :max_nesting => false)["result"]
|
data/lib/jasmine/server.rb
CHANGED
@@ -1,40 +1,19 @@
|
|
1
|
-
require 'rack'
|
2
|
-
require 'rack/utils'
|
3
|
-
require 'jasmine-core'
|
4
|
-
require 'rack/jasmine/runner'
|
5
|
-
require 'rack/jasmine/focused_suite'
|
6
|
-
require 'rack/jasmine/redirect'
|
7
|
-
require 'rack/jasmine/cache_control'
|
8
|
-
require 'ostruct'
|
9
|
-
|
10
1
|
module Jasmine
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
page = Jasmine::Page.new(config_shim.instance_eval { binding })
|
17
|
-
Rack::Builder.app do
|
18
|
-
use Rack::Head
|
19
|
-
use Rack::Jasmine::CacheControl
|
20
|
-
if Jasmine::Dependencies.rails_3_asset_pipeline?
|
21
|
-
map('/assets') do
|
22
|
-
run Rails.application.assets
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
map('/run.html') { run Rack::Jasmine::Redirect.new('/') }
|
27
|
-
map('/__suite__') { run Rack::Jasmine::FocusedSuite.new(config) }
|
28
|
-
|
29
|
-
map('/__JASMINE_ROOT__') { run Rack::File.new(Jasmine::Core.path) }
|
30
|
-
map(config.spec_path) { run Rack::File.new(config.spec_dir) }
|
31
|
-
map(config.root_path) { run Rack::File.new(config.project_root) }
|
2
|
+
class Server
|
3
|
+
def initialize(port = 8888, application = Jasmine::Application.app)
|
4
|
+
@port = port
|
5
|
+
@application = application
|
6
|
+
end
|
32
7
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
8
|
+
def start
|
9
|
+
if Jasmine::Dependencies.legacy_rack?
|
10
|
+
handler = Rack::Handler.get('webrick')
|
11
|
+
handler.run(@application, :Port => @port, :AccessLog => [])
|
12
|
+
else
|
13
|
+
server = Rack::Server.new(:Port => @port, :AccessLog => [])
|
14
|
+
# workaround for Rack bug, when Rack > 1.2.1 is released Rack::Server.start(:app => Jasmine.app(self)) will work
|
15
|
+
server.instance_variable_set(:@app, @application)
|
16
|
+
server.start
|
38
17
|
end
|
39
18
|
end
|
40
19
|
end
|
@@ -27,7 +27,7 @@ namespace :jasmine do
|
|
27
27
|
t.rspec_opts = ["--colour", "--format", ENV['JASMINE_SPEC_FORMAT'] || "progress"]
|
28
28
|
t.verbose = true
|
29
29
|
if Jasmine::Dependencies.rails_3_asset_pipeline?
|
30
|
-
t.
|
30
|
+
t.rspec_opts += ["-r #{File.expand_path(File.join(::Rails.root, 'config', 'environment'))}"]
|
31
31
|
end
|
32
32
|
t.pattern = [Jasmine.runner_filepath]
|
33
33
|
end
|
@@ -48,7 +48,7 @@ namespace :jasmine do
|
|
48
48
|
port = ENV['JASMINE_PORT'] || 8888
|
49
49
|
puts "your tests are here:"
|
50
50
|
puts " http://localhost:#{port}/"
|
51
|
-
Jasmine::
|
51
|
+
Jasmine::Server.new(port).start
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
data/lib/jasmine/version.rb
CHANGED
@@ -2,12 +2,12 @@ module Rack
|
|
2
2
|
module Jasmine
|
3
3
|
|
4
4
|
class FocusedSuite
|
5
|
-
def initialize(
|
6
|
-
@
|
5
|
+
def initialize(runner_config)
|
6
|
+
@runner_config = runner_config
|
7
7
|
end
|
8
8
|
|
9
9
|
def call(env)
|
10
|
-
run_adapter = Rack::Jasmine::RunAdapter.new(@
|
10
|
+
run_adapter = Rack::Jasmine::RunAdapter.new(@runner_config)
|
11
11
|
run_adapter.run(env["PATH_INFO"])
|
12
12
|
end
|
13
13
|
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rack/test'
|
3
|
+
|
4
|
+
describe "Jasmine::Application" do
|
5
|
+
include Rack::Test::Methods
|
6
|
+
|
7
|
+
def app
|
8
|
+
@root = File.join(File.dirname(__FILE__))
|
9
|
+
runner_config = double("config",
|
10
|
+
:project_root => @root,
|
11
|
+
:spec_dir => File.join(@root, "fixture", "spec"),
|
12
|
+
:spec_path => "/__spec__",
|
13
|
+
:root_path => "/__root__",
|
14
|
+
:css_files => [],
|
15
|
+
:jasmine_files => [],
|
16
|
+
:js_files => ["path/file1.js", "path/file2.js"],
|
17
|
+
:src_dir => File.join(@root, "fixture", "src"),
|
18
|
+
:src_files => ["file1.js"],
|
19
|
+
:spec_files => ["example_spec.js"])
|
20
|
+
Jasmine::Application.app(runner_config)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "includes no-cache headers for specs" do
|
24
|
+
get "/__spec__/example_spec.js"
|
25
|
+
last_response.headers.should have_key("Cache-Control")
|
26
|
+
last_response.headers["Cache-Control"].should == "max-age=0, private, must-revalidate"
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should serve static files from spec dir under __spec__" do
|
30
|
+
get "/__spec__/example_spec.js"
|
31
|
+
last_response.status.should == 200
|
32
|
+
last_response.content_type.should == "application/javascript"
|
33
|
+
last_response.body.should == File.read(File.join(@root, "fixture/spec/example_spec.js"))
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should serve static files from root dir under __root__" do
|
37
|
+
get "/__root__/fixture/src/example.js"
|
38
|
+
last_response.status.should == 200
|
39
|
+
last_response.content_type.should == "application/javascript"
|
40
|
+
last_response.body.should == File.read(File.join(@root, "fixture/src/example.js"))
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should serve static files from src dir under /" do
|
44
|
+
get "/example.js"
|
45
|
+
last_response.status.should == 200
|
46
|
+
last_response.content_type.should == "application/javascript"
|
47
|
+
last_response.body.should == File.read(File.join(@root, "fixture/src/example.js"))
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should serve Jasmine static files under /__JASMINE_ROOT__/" do
|
51
|
+
get "/__JASMINE_ROOT__/jasmine.css"
|
52
|
+
last_response.status.should == 200
|
53
|
+
last_response.content_type.should == "text/css"
|
54
|
+
last_response.body.should == File.read(File.join(Jasmine::Core.path, "jasmine.css"))
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should serve focused suites when prefixing spec files with /__suite__/" do
|
58
|
+
pending "Temporarily removing this feature (maybe permanent)"
|
59
|
+
Dir.stub!(:glob).and_return { |glob_string| [glob_string] }
|
60
|
+
get "/__suite__/file2.js"
|
61
|
+
last_response.status.should == 200
|
62
|
+
last_response.content_type.should == "text/html"
|
63
|
+
last_response.body.should include("\"/__spec__/file2.js")
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should redirect /run.html to /" do
|
67
|
+
get "/run.html"
|
68
|
+
last_response.status.should == 302
|
69
|
+
last_response.location.should == "/"
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should 404 non-existent files" do
|
73
|
+
get "/some-non-existent-file"
|
74
|
+
last_response.should be_not_found
|
75
|
+
end
|
76
|
+
|
77
|
+
describe "/ page" do
|
78
|
+
it "should load each js file in order" do
|
79
|
+
get "/"
|
80
|
+
last_response.status.should == 200
|
81
|
+
last_response.body.should include("path/file1.js")
|
82
|
+
last_response.body.should include("path/file2.js")
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should return an empty 200 for HEAD requests to /" do
|
86
|
+
head "/"
|
87
|
+
last_response.status.should == 200
|
88
|
+
last_response.headers['Content-Type'].should == 'text/html'
|
89
|
+
last_response.body.should == ''
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should tell the browser not to cache any assets" do
|
93
|
+
head "/"
|
94
|
+
['Pragma'].each do |key|
|
95
|
+
last_response.headers[key].should == 'no-cache'
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Jasmine::AssetPipelineMapper do
|
4
|
+
describe "mapping files" do
|
5
|
+
it "should retrieve asset paths from the asset pipeline for passed files" do
|
6
|
+
#TODO: this expects all src files to be asset pipeline files
|
7
|
+
src_files = ["assets/application.js", "assets/other_manifest.js"]
|
8
|
+
asset_context = double("asset context")
|
9
|
+
asset_context.stub_chain(:asset_paths, :asset_for).with("application", "js").and_return(['asset1.js', 'asset2.js'])
|
10
|
+
asset_context.stub_chain(:asset_paths, :asset_for).with("other_manifest", "js").and_return(['asset1.js', 'asset3.js'])
|
11
|
+
asset_context.stub(:asset_path) do |asset|
|
12
|
+
"/some_location/#{asset}"
|
13
|
+
end
|
14
|
+
mapper = Jasmine::AssetPipelineMapper.new(src_files, asset_context)
|
15
|
+
mapper.files.should == ['some_location/asset1.js?body=true', 'some_location/asset2.js?body=true', 'some_location/asset3.js?body=true']
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/spec/config_spec.rb
CHANGED
@@ -4,6 +4,8 @@ require 'selenium-webdriver'
|
|
4
4
|
describe Jasmine::Config do
|
5
5
|
describe "configuration" do
|
6
6
|
before :each do
|
7
|
+
Jasmine::Dependencies.stub(:rails_3_asset_pipeline?) { false }
|
8
|
+
|
7
9
|
temp_dir_before
|
8
10
|
|
9
11
|
Dir::chdir @tmp
|
@@ -239,83 +241,46 @@ describe Jasmine::Config do
|
|
239
241
|
end
|
240
242
|
end
|
241
243
|
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
244
|
+
|
245
|
+
describe "jasmine_stylesheets" do
|
246
|
+
it "should return the relative web server path to the core Jasmine css stylesheets" do
|
247
|
+
#TODO: wrap Jasmine::Core with a class that knows about the core path and the relative mapping.
|
248
|
+
Jasmine::Core.stub(:css_files).and_return(["my_css_file1.css", "my_css_file2.css"])
|
249
|
+
Jasmine::Config.new.jasmine_stylesheets.should == ["/__JASMINE_ROOT__/my_css_file1.css", "/__JASMINE_ROOT__/my_css_file2.css"]
|
247
250
|
end
|
248
|
-
|
249
|
-
it "should use firefox by default" do
|
250
|
-
stub_env_hash({"JASMINE_BROWSER" => nil})
|
251
|
-
config = Jasmine::Config.new
|
252
|
-
config.stub!(:start_jasmine_server)
|
253
|
-
Jasmine::SeleniumDriver.should_receive(:new).
|
254
|
-
with("firefox", anything).
|
255
|
-
and_return(mock(Jasmine::SeleniumDriver, :connect => true))
|
256
|
-
config.start
|
257
|
-
end
|
251
|
+
end
|
258
252
|
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
Jasmine::SeleniumDriver.should_receive(:new).
|
264
|
-
with("mosaic", anything).
|
265
|
-
and_return(mock(Jasmine::SeleniumDriver, :connect => true))
|
266
|
-
config.start
|
267
|
-
end
|
253
|
+
describe "jasmine_javascripts" do
|
254
|
+
it "should return the relative web server path to the core Jasmine css javascripts" do
|
255
|
+
Jasmine::Core.stub(:js_files).and_return(["my_js_file1.js", "my_js_file2.js"])
|
256
|
+
Jasmine::Config.new.jasmine_javascripts.should == ["/__JASMINE_ROOT__/my_js_file1.js", "/__JASMINE_ROOT__/my_js_file2.js"]
|
268
257
|
end
|
258
|
+
end
|
269
259
|
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
config.instance_variable_set(:@jasmine_server_port, '1234')
|
275
|
-
config.stub!(:start_jasmine_server)
|
276
|
-
|
277
|
-
Jasmine::SeleniumDriver.should_receive(:new).
|
278
|
-
with(anything, "http://localhost:1234/").
|
279
|
-
and_return(mock(Jasmine::SeleniumDriver, :connect => true))
|
280
|
-
config.start
|
281
|
-
end
|
260
|
+
describe "when the asset pipeline is active" do
|
261
|
+
before do
|
262
|
+
Jasmine::Dependencies.stub(:rails_3_asset_pipeline?) { true }
|
263
|
+
end
|
282
264
|
|
283
|
-
|
284
|
-
stub_env_hash({"JASMINE_HOST" => "http://some_host"})
|
285
|
-
config = Jasmine::Config.new
|
286
|
-
config.instance_variable_set(:@jasmine_server_port, '1234')
|
287
|
-
config.stub!(:start_jasmine_server)
|
265
|
+
let(:src_files) { ["assets/some.js", "assets/files.js"] }
|
288
266
|
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
config.
|
267
|
+
let(:config) do
|
268
|
+
Jasmine::Config.new.tap do |config|
|
269
|
+
#TODO: simple_config should be a passed in hash
|
270
|
+
config.stub(:simple_config) { { 'src_files' => src_files} }
|
293
271
|
end
|
272
|
+
end
|
294
273
|
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
config.stub!(:start_server)
|
300
|
-
Jasmine::SeleniumDriver.should_receive(:new).
|
301
|
-
with(anything, "http://localhost:4321/").
|
302
|
-
and_return(mock(Jasmine::SeleniumDriver, :connect => true))
|
303
|
-
config.start
|
304
|
-
end
|
274
|
+
it "should use AssetPipelineMapper to return src_files" do
|
275
|
+
mapped_files = ["some.js", "files.js"]
|
276
|
+
Jasmine::AssetPipelineMapper.stub_chain(:new, :files).and_return(mapped_files)
|
277
|
+
config.src_files.should == mapped_files
|
305
278
|
end
|
306
279
|
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
Jasmine::SeleniumDriver.new('firefox', 'http://localhost:8888')
|
312
|
-
end
|
313
|
-
it "should use an local selenium server with a specific port if SELENIUM_SERVER_PORT is set" do
|
314
|
-
stub_env_hash({"SELENIUM_SERVER_PORT" => "4441"})
|
315
|
-
Selenium::WebDriver.should_receive(:for).with(:remote, :url => "http://localhost:4441/wd/hub", :desired_capabilities => :firefox)
|
316
|
-
Jasmine::SeleniumDriver.new('firefox', 'http://localhost:8888')
|
317
|
-
end
|
280
|
+
it "should pass the config src_files to the AssetPipelineMapper" do
|
281
|
+
Jasmine::Config.stub(:simple_config)
|
282
|
+
Jasmine::AssetPipelineMapper.should_receive(:new).with(src_files).and_return(double("mapper").as_null_object)
|
283
|
+
config.src_files
|
318
284
|
end
|
319
285
|
end
|
320
|
-
|
321
286
|
end
|