2012-02-23 6 views
5

最近、(永続的な)計算カラムを含むテーブルを呼び出すプロシージャで、いくつかのtSQLtデータベースユニットテスト(Red Gate SQL Test経由)を書いていますが、FakeTable SPを使用すると、私は、計算された列は、(NULLとして評価されていません)が入力されていないことがわかります。計算された列はテストの鍵ですので、テストの列を無視することはできません。論理を重複させたくありません。計算カラムでtSQLtを使用したユニットテスト

私はtSQLt.AssertEqualsTable SPを使用して結果を評価していますので、両方で列の値が同じであることを確認します。

実際には、FakeTableを使用せず、テストの最後に(部分的な)ロールバックトランザクションステートメント(ブログポストhttp://sqlity.net/en/585/how-to-rollback-in-procedures/)を使用するか、テスト値を明示的に削除することで対処しました。

このテストをコーディングするには、より良い方法が必要であると確信しており、いかなる提案も歓迎します。

答えて

4

テスト時に計算された列のロジックと手順のロジックを分離する必要があります。この手順では、その列の情報を取得してその情報を処理します。このプロシージャは、列が計算列または実列であることを考慮する必要はありません。つまり、テストではその値をハードコーディングしてその列に入れることができます。 FakeTableは、計算された列を実数の列に変換することによって可能にします。

別の一連のテストでは、計算列が正しく計算されることをテストできます。 FakeTableへの追加が利用可能です。これは、テーブルの計算されたプロパティを保持します。 EXECUTE tSQLt.FakeTableの@ComputedColumnパラメータを1に設定する必要があります(http://tsqlt.org/user-guide/isolating-dependencies/faketable/

Btw、テストでは何もロールバックする必要はありません。 tSQLtはすでにそれを世話しています。あなたが言及した記事で説明されているロジックは、トランザクション管理がそのプロセスの要件である場合には、自分の手続きでのみ必要です。 http://groups.google.com/group/tsqlt

プレリリースがFakeTable中に計算列またはデフォルト値を保存するための機能が含まれています

+0

ありがとうございますSabastian、これは非常に役に立ちます。私は2つのテストを組み合わせようとしていましたが、あなたが指摘するように、これらは異なるテストでなければなりません。 – DaveGreen

3

は現在、メーリングリスト上で利用可能tSQLtへのプレリリースの更新があります。

例:
EXEC tSQLt.FakeTable 'dbo.tst1'、@ComputedColumns = 1。
EXEC tSQLt.FakeTable 'dbo.tst1'、@ Defaults = 1;

これはすぐに正式リリースされる予定です。

関連する問題