Don't return nil for methods using NoReturn

This commit is contained in:
Michael Miller 2022-07-13 12:24:29 -06:00
parent 14d8c046f0
commit aa9ca7a98e
No known key found for this signature in database
GPG key ID: 32B47AE8F388A1FF
4 changed files with 96 additions and 2 deletions

View file

@ -400,6 +400,31 @@ Spectator.describe Spectator::Mock do
end
end
end
context "with a method that uses NoReturn" do
abstract class Thing
abstract def oops : NoReturn
end
Spectator::Mock.define_subtype(:class, Thing, MockThing)
let(mock) { MockThing.new }
after_each { mock._spectator_clear_stubs }
it "raises a TypeCastError when using a value-based stub" do
stub = Spectator::ValueStub.new(:oops, nil).as(Spectator::Stub)
mock._spectator_define_stub(stub)
expect { mock.oops }.to raise_error(TypeCastError, /NoReturn/)
end
it "raises when using an exception stub" do
exception = ArgumentError.new("bogus")
stub = Spectator::ExceptionStub.new(:oops, exception).as(Spectator::Stub)
mock._spectator_define_stub(stub)
expect { mock.oops }.to raise_error(ArgumentError, "bogus")
end
end
end
describe "#inject" do
@ -719,5 +744,32 @@ Spectator.describe Spectator::Mock do
end
end
end
context "with a method that uses NoReturn" do
struct ::NoReturnThing
def oops : NoReturn
raise "oops"
end
end
Spectator::Mock.inject(:struct, ::NoReturnThing)
let(mock) { NoReturnThing.new }
after_each { mock._spectator_clear_stubs }
it "raises a TypeCastError when using a value-based stub" do
stub = Spectator::ValueStub.new(:oops, nil).as(Spectator::Stub)
mock._spectator_define_stub(stub)
expect { mock.oops }.to raise_error(TypeCastError, /NoReturn/)
end
it "raises when using an exception stub" do
exception = ArgumentError.new("bogus")
stub = Spectator::ExceptionStub.new(:oops, exception).as(Spectator::Stub)
mock._spectator_define_stub(stub)
expect { mock.oops }.to raise_error(ArgumentError, "bogus")
end
end
end
end