kazuk は null に触れてしまった

C# / .NET 系技術ネタ縛りでお送りしております

Code Contracts あったまいー&あほー


こんなインターフェースにね。

    [ContractClass(typeof(BatchContract<>))]

    public interface IBatch<T>

    {

        bool Initialize(IBatchHost host);

        IBatchHost Host { get; }

        bool Initialized { get; }

        void Process(IEnumerable<T> items);

    }

こんな契約を書いて

    [ContractClassFor(typeof(IBatch<>))]

    public abstract class BatchContract<T> : IBatch<T>

    {

        public bool Initialize(IBatchHost host)

        {

            Contract.Requires<ArgumentNullException>( host!=null);

            Contract.Ensures(Initialized == Contract.Result<bool>());

            Contract.Ensures(Host == host);

            Contract.EndContractBlock();

            return true;

        }

        public IBatchHost Host { get; private set; }

        public void Process( IEnumerable<T> items )

        {

            Contract.Requires<ArgumentNullException>(items!=null);

            Contract.ForAll(items, _ => _ != null);

        }

        public bool Initialized {

            get; private set; }

    }

こうやって呼ぶ。

        [TestMethod]

        public void TestMethod1()

        {

            var host = new Mock.MockBatchHost();

            var batch = new Mock.MockBatch();

            batch.Initialize(host);

        }

実装がこうだと

        public bool Initialize(IBatchHost host)

        {

            return true;

        }

CodeContracts: BatchFrameworkTest: Run static contract analysis.

CodeContracts: BatchFrameworkTest: Static contract analysis done.

  elapsed time: 207ms

CodeContracts: BatchFrameworkTest: Validated: 33.3%

CodeContracts: BatchFrameworkTest: Total methods analyzed 12

CodeContracts: BatchFrameworkTest: Total time 2.460sec. 205ms/method

MockBatch.cs(14,13): warning : CodeContracts: ensures unproven: Initialized == Contract.Result<bool>()

IBatch.cs(28,13): warning :   + location related to previous warning

MockBatch.cs(14,13): warning : CodeContracts: ensures unproven: Host == host

IBatch.cs(29,13): warning :   + location related to previous warning

Test.dll(1,1): message : CodeContracts: Checked 3 assertions: 1 correct 2 unknown

すごいよ、Host プロパティ設定してないとか、チェックしてくれてるよ。

実装がこうだと

        public bool Initialize(IBatchHost host)

        {

            throw new NotImplementedException();

        }

CodeContracts: BatchFrameworkTest: Run static contract analysis.

CodeContracts: BatchFrameworkTest: Static contract analysis done.

  elapsed time: 276ms

CodeContracts: BatchFrameworkTest: Validated: 100%

CodeContracts: BatchFrameworkTest: Total methods analyzed 12

CodeContracts: BatchFrameworkTest: Total time 2.204sec. 183ms/method

Test.dll(1,1): message : CodeContracts: Checked 1 assertion: 1 correct

CodeContracts: BatchFrameworkTest: 

  elapsed time: 279ms

うひ、「つくってねーよ」が契約OKですかー

例外投げた時点で契約通りの挙動じゃないってのは解るんですが、これはちと「あほー」かなと。

ちゃんとテストを書いて動かそう。そうしないと未実装は Code Contracts では検出できないぜ!

ちなみに ReSharper 使いの人は ReSharper –> Window –> TODO Explorer で NotImplementedExceptionを投げている所を TODOとして検出してくれるよ。

(JetBrains の回し物だ、間違いない)

広告

Code Contracts あったまいー&あほー」への1件のフィードバック

  1. ピンバック:Visual Studio 2010 後の世代のプログラミング(1) Code Contracts « kazuk は null に触れてしまった

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。