1

UnitTest を実装して、例外も発生させるコード ブロックにデータを記録することをテストしようとしています。

したがって、コードは次のようになります。

--CREATE TABLE dbo.ErrorLog (ID int IDENTITY (1,1), ErrorDescription Varchar(100))
GO
ALTER PROCEDURE dbo.TestError
AS
DECLARE @Error varchar(100) = 'one is not equal to two'
--do some work
IF 1 <> 2
  BEGIN 
    INSERT dbo.ErrorLog (ErrorDescription) VALUES (@error)
    RAISERROR (@Error,16,1)
    RETURN
  END
GO

そして、エラーに取り組んでいるときに、ErrorLog へのエラーの挿入をテストしたいと思います。だから私はこのような私のテストを書いた:

EXEC tSQLt.NewTestClass 'Error'
GO

CREATE PROCEDURE error.test_GivenError_LogResult
AS
--Arrange
EXEC tSQLt.FakeTable 'dbo.ErrorLog'
DECLARE @Actual varchar(100)
DECLARE @Expected Varchar(100) = ('one is not equal to two')

--Act
--EXEC tSQLt.ExpectException @ExpectedMessage = 'one is not equal to two'

EXEC dbo.TestError
SELECT top 1 @Actual = ErrorDescription FROM dbo.ErrorLog

--ASSERT

EXEC tSQLt.AssertEquals @Expected, @Actual 
GO

EXEC tsqlt.Run 'Error'

上記のようにこのテストを実行すると、proc でエラーが報告され、Assert は実行されません。tSQLt.ExpectException を含めると、例外は渡されますが、ErrorLog の結果に対して AssertEquals は実行されません。

これを回避する方法はありますか?

4

1 に答える 1

0

これを行うには、RAISERROR の周りに Utils.GenerateError(@error, @serverity, @state) というラッパー クラスを作成し、RAISERROR を呼び出すことをお勧めします。そうすれば、単純に EXEX tSQLt.SpyProcedure 'Utils.GenerateError' を使用して、実際にエラーを発生させるコードをモックアウトできます。実際にエラーをスローすることはもうないので、テストで ExpectException を呼び出しても意味がないことに注意してください。代わりに、正しいパラメーターがスパイ プロシージャに渡されたことを確認できます。Utils.GenerateError のテストも非常に簡単です。

于 2013-10-02T07:53:09.067 に答える