web-dev-qa-db-ja.com

Webクライアントを単体テストする方法は?

Webクライアントを単体テストする方法を理解するのに多くの問題を抱えています。

私は初めてTDDを使用してプロジェクトを終了しました-このプロジェクトは、API呼び出しやデータベースなどの外部の依存関係がなく、純粋なC#コードでした。私は間違いなくTDDを使用することの利点を見たので、それを実践し続けたいと思います。

次のプロジェクトでは、SOAPクライアントを作成します。APIに正常にログインする簡単なIClientを使用する最初のテストを通過するのに苦労しています。

IClientインターフェースは次のとおりです。

public interface IClient
{
    bool IsLoggedIn { get; }
    bool Login(out string error);
}

私はこれをどのようにテストするかわかりません。単体テストの方法はLogin_WithValidCredentials_ReturnsTrueですが、APIからのすべての可能な応答を実際にシミュレートせずにこれを行う方法がわかりません。このコードは実際に単体テスト可能ですか、それとも統合テストに任せるべきですか?.

簡単な単体テストの例を誰かに教えてもらえれば、私は非常に感謝します(私はMoqを使用しています)。

3
Sherlock

単体テストは高速に実行され、外部の依存関係はありません。統合テストでは、Webサービスを呼び出すメソッドをカバーする必要があります。

クライアントで認証ロジックを単体テストすることはできません。サーバーで行う必要があります。

[WebMethod]
Authenticator{
 bool Login(Credentials credentials){
   return TestableClass.Login(credentials);
 }
}

今、あなたはサーバー上でユニットテストを書くことができます

Login_WithValidCredentials_ReturnsTrue(){
   // test TestableClass.login here
}

サービスを使用するクライアント側のコードをテストすることもできます。次のようなコードがあるとしましょう:(私のc#を許してください)

Class LoggerOnner{
  public LoggerOnner(IClient client, Response response){
    this.client = client
    this.page = page
  }

  Login() {
   if(this.client.Authenticate())
       response.sendPage("authenticated.aspx");
   else{
       response.sendError()
   }
  }
} 

あなたはそれがあなたのクライアントを正しく使用することをテストすることができます(私がmocが機能すると想像する方法:)

IClient mocClient= moq.Create(IClient).Authenticate( x-> return true );
Request moxRequest = moq.Create(Request);

LoggerOnner lo = new LoggerOnner(mocClient, mocRequest);

Assert( mocRequst.sendPage().calledWithArgs("authenticated.aspx"));

TLDR;クライアントクラスをユニットテストせず、小さくして、その他すべてをテストする

2
roo2