1

単体テストを作成するのは初めてです。簡単なクラスと機能のために、いくつかから始めました。

しかし、より複雑な状況ではいくつか問題があります。

例えば:

方法があります"ResultObject getServerStatus(string ip,string user,string pass,...)"

この方法では、サーバーへの SSH 接続が確立され、いくつかのチェックが行われます。

「SSH接続とSSHシェルとの相互作用」や「SNMPリクエスト」などの依存関係をテスト(シミュレート)する正しい方法は何ですか? 明らかに、私のテスト環境では、チェックできるサーバーや SNMP デバイスはありません。

このような複雑なシナリオをテストする正しい方法は何ですか?また、そのような依存関係の良い例をいくつか教えていただけますか?

4

1 に答える 1

1

クラスでサードパーティのロジックを分離する必要があります。

例:

public class MyClass
{
    private SshMagic _sshMagic = new SshMagic(); // or something like that

    ...
    ResultObject getServerStatus(string ip,string user,string pass,...)
    {
        if (..)
        {
           return _sshMagic.Something();
        }
        else
        {
            ...
        }
    }
}

あなたがテストしたいのは、あなたのコードです: 条件、ループなどです.return _sshMagic.Something()行は外部ロジックです, あなたは間違いなくそれをテストしたくない.

最初の一歩

インターフェイスの背後に SshMagic をラップします。これには次の 2 つの利点があります。

1) いつでも実装を変更できます (異なる API を備えた新しいバージョンが出てくるように、ラッパーのみを書き直す必要があります。他のすべてのコードはおそらく少し変更する必要はありません)。

2) アダプターを作成し、SshMagic クラスなどの実装の詳細ではなく、やりたいことに集中する良い機会です。例: メソッドで 4 つのうち 2 つのパラメーターを使用しない場合は、それらを非表示にすることができます。または、3 つのメソッドを一緒に呼び出す場合は、それらを 1 つのメソッドにラップすることができます...

例:

public interface ISshMagic
{
    ...
    ResultObject Something();
    ...   
}

public class MyClass
{
    private ISshMagic _sshMagic;

    public MyClass(ISshMagic sshMagic)
    {
        _sshMagic = sshMagic;
    }

    ...
}

第二段階

依存関係を分離したので、ろくでなしをモックします。MoqSimple.Mockingなどのモッキング フレームワークを 1 つ選択する必要があります。例として、ここでは Simple.Mocking を使用します。

ここで MockObject を作成します。

[TestFixture]
public class UnitTesty
{
    ...
    [Test]
    public void GetServerStatus_Will_Call_Something_Of_SshMagic()
    {
        ...
        _mockSshMagic = Mock.Interface<ISshMagic>();
        MyClass myClass = new MyClass(_mockSshMagic);
        ...

        // we are setting up that _mockSshMagic.Something() will be called
        Expect.Once.MethodCall(() => _mockSshMagic.Something());
        ...

        // do your test here...
        myClass.("255.255.255.0", "Me", "MyPassword", ...);
        ...

        // we are checking that our expectations were met:
        AssertInvocationsWereMade.MatchingExpectationsFor(_mockSshMagic);
    }
}
于 2013-10-17T11:52:53.240 に答える