2

Moq を使用して C# で単体テストを行う方法を学ぼうとしています。関数を持つ単純なクラス、BasicMath をセットアップしますint Multiply(int a, int b)。本体は単に a * b を返します。関数 'int Square(int a)' を持つ AdvancedMath という別のクラスがあり、本体は Multiply(a,a) を呼び出して結果を返します。

BasicMath.Multiply が正しい値で呼び出されることをアサートする AdvancedMath.Square の簡単なテストを作成しようとしています。普通のパブリック関数ではできないのは承知しておりますので、関数を仮想化しましたが、いまだに困っています。誰かがこれがどのように行われるかを説明できますか? どちらのクラスにも、デフォルトの空のコンストラクター以外のコンストラクターはありません。

これが私の試みです:

class test_Advanced_Functions
{
    [Test]
    public void test_SquareFunction_Should_return_correct_result()
    {
        // Arrange
        Mock<BasicFunctions> mock = new Mock<BasicFunctions>();
        AdvancedFunctions af = new AdvancedFunctions();

        // Act
        int result = af.Square(5);

        //Assert
        mock.Verify(d => d.Multiply(5, 5), Times.Exactly(1));
    }
4

2 に答える 2

3

AdvancedMathから派生すると仮定すると、仮想BasicMathの場合に Moq でテストできます。Multiply

var mock = new Mock<AdvancedMath>();
mock.Setup(m => m.Multiply(2, 2)).Returns(4);
mock.Object.Square(2);
mock.VerifyAll();

BasicMathwithinを使用する場合AdvancedMath(つまり、Multiplyが静的で から直接呼び出される場合Square)、そのような相互作用を Moqでテストすることはできません。理由については、この質問を参照してください。

ただし、このような単純なケースで動作ベースの検証を行うのは正しくないようです。「何をテストしたいですか?」という質問に答える必要があります。. それSquare は機能しますか、それともいくつかのメソッドを呼び出しますか? このテスト (これからやろうとしていること) は、 に責任を委任するだけで、Multiplyうまくいくと仮定します。Square実装は複数の方法で変更される可能性があり (を使用しない場合などMultiply)、テストが中断される可能性がありますが、そうすべきではありません。

于 2012-05-07T15:55:56.403 に答える
1

Moq作成していないインスタンスの動作を変更することはできません。

依存性注入を実践して、クラスを単体テスト可能に記述する必要があります。AdvancedFunctions明らかに に依存しているため、単独でing するのではなく、コンストラクターの引数として を渡すBasicFunctions必要があります。BasicFunctionsnew

于 2012-05-07T15:58:20.790 に答える