summaryrefslogtreecommitdiff
path: root/spec/mspec/spec/runner/formatters/yaml_spec.rb
blob: 2e334fdbb94372f08be7779893056e2cbffb6bec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
require File.dirname(__FILE__) + '/../../spec_helper'
require 'mspec/runner/formatters/yaml'
require 'mspec/runner/example'
require 'mspec/helpers'

RSpec.describe YamlFormatter, "#initialize" do
  it "permits zero arguments" do
    YamlFormatter.new
  end

  it "accepts one argument" do
    YamlFormatter.new nil
  end
end

RSpec.describe YamlFormatter, "#print" do
  before :each do
    $stdout = IOStub.new
    @out = IOStub.new
    allow(File).to receive(:open).and_return(@out)
    @formatter = YamlFormatter.new "some/file"
  end

  after :each do
    $stdout = STDOUT
  end

  it "writes to $stdout if #switch has not been called" do
    @formatter.print "begonias"
    expect($stdout).to eq("begonias")
    expect(@out).to eq("")
  end

  it "writes to the file passed to #initialize once #switch has been called" do
    @formatter.switch
    @formatter.print "begonias"
    expect($stdout).to eq("")
    expect(@out).to eq("begonias")
  end

  it "writes to $stdout once #switch is called if no file was passed to #initialize" do
    formatter = YamlFormatter.new
    formatter.switch
    formatter.print "begonias"
    expect($stdout).to eq("begonias")
    expect(@out).to eq("")
  end
end

RSpec.describe YamlFormatter, "#finish" do
  before :each do
    @tally = double("tally").as_null_object
    @counter = double("counter").as_null_object
    allow(@tally).to receive(:counter).and_return(@counter)
    allow(TallyAction).to receive(:new).and_return(@tally)

    @timer = double("timer").as_null_object
    allow(TimerAction).to receive(:new).and_return(@timer)

    @out = tmp("YamlFormatter")

    context = ContextState.new "describe"
    @state = ExampleState.new(context, "it")

    @formatter = YamlFormatter.new(@out)
    allow(@formatter).to receive(:backtrace).and_return("")
    allow(MSpec).to receive(:register)
    @formatter.register

    exc = ExceptionState.new @state, nil, MSpecExampleError.new("broken")
    allow(exc).to receive(:backtrace).and_return("path/to/some/file.rb:35:in method")
    @formatter.exception exc
    @formatter.after @state
  end

  after :each do
    rm_r @out
  end

  it "calls #switch" do
    expect(@formatter).to receive(:switch).and_call_original
    @formatter.finish
  end

  it "outputs a failure message and backtrace" do
    @formatter.finish
    output = File.read(@out)
    expect(output).to include "describe it ERROR"
    expect(output).to include "MSpecExampleError: broken\\n"
    expect(output).to include "path/to/some/file.rb:35:in method"
  end

  it "outputs an elapsed time" do
    expect(@timer).to receive(:elapsed).and_return(4.2)
    @formatter.finish
    output = File.read(@out)
    expect(output).to include "time: 4.2"
  end

  it "outputs a file count" do
    expect(@counter).to receive(:files).and_return(3)
    @formatter.finish
    output = File.read(@out)
    expect(output).to include "files: 3"
  end

  it "outputs an example count" do
    expect(@counter).to receive(:examples).and_return(3)
    @formatter.finish
    output = File.read(@out)
    expect(output).to include "examples: 3"
  end

  it "outputs an expectation count" do
    expect(@counter).to receive(:expectations).and_return(9)
    @formatter.finish
    output = File.read(@out)
    expect(output).to include "expectations: 9"
  end

  it "outputs a failure count" do
    expect(@counter).to receive(:failures).and_return(2)
    @formatter.finish
    output = File.read(@out)
    expect(output).to include "failures: 2"
  end

  it "outputs an error count" do
    expect(@counter).to receive(:errors).and_return(1)
    @formatter.finish
    output = File.read(@out)
    expect(output).to include "errors: 1"
  end
end