クラスでサードパーティのロジックを分離する必要があります。
例:
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;
}
...
}
第二段階
依存関係を分離したので、ろくでなしをモックします。MoqやSimple.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);
}
}