1

私は自分のプロジェクトにある電子メールと SMS の送信者の単体テストを書きたいと思っています。もちろん、それらはオープン システムであるため、エンドツーエンドで機能をテストすることはできません。だから私はそれらをテストする賢い方法を探しています。

以下は、電子メールとSMSを送信するために使用しているコードです。

Eメール:

    public void Send(MailMessage msg)
    {
        SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
        client.EnableSsl = true;
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.Credentials = new NetworkCredential(emailSetting.EmailUser
        , emailSetting.EmailPass);
        client.Send(msg);
    }

SMS :

   public void SendSMS( String toNumber, String message)
    {
         if (client != null)
            client.SendSmsMessage(smsSetting.SMS_Num, toNumber, message);
    }
4

3 に答える 3

3

これに関する問題は、本当にunit-tests を使用する場合はmock、メール/SMS クライアントが必要になることです。

実際に電子メールを送信したい場合 (夜間や開発サイクル中に実行するとスパムになります)、それらは単体テストとして分類されず、統合テストとして分類されます。

モックの例として:

 public class EmailThingy
 {
     private readonly IEmailClient _client;

     public EmailThingy(IEmailClient client)
     {
          _client = client;
     }

     public void Send()
     {
          // do stuff with client
     }
 }

単体テストで

    [Test]
    public void SendEmail()
    {
        var clientMock = MockRepository.GenerateMock<IEmailClient>();

        // define behaviour for clientmock

        var sut = new EmailThingy(clientMock);
        sut.SendMail();
    }
于 2013-02-10T12:27:54.470 に答える
1

for sms 以下の方法で行うことができます。

ステップ 1: Web.Config ファイルに移動し、次のタグを追加します。

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="E:\MailTest\"/>
        </smtp>
    </mailSettings>
</system.net>

ピックアップ場所として指定したディレクトリが存在する必要があることを確認してください。

ステップ 2 : メール送信機能をテストします。button_click を使用して、次のコードでこの機能をテストしました。

SmtpClient smtp = new SmtpClient();
MailMessage message = new MailMessage("me@gmail.com", "me@yahoo.com","My Message Subject","This is a test message");
smtp.Send(message);

出力 : ランダムに生成された GUID 名を持つ .eml ファイルがフォルダー内に作成されます。これは、受信後に確認できる電子メールです。私にとっては、次のようなファイルを作成しましたc127d1d5-255d-4a5a-873c-409e23002eef.eml in E:\MailTest\ folder

于 2013-02-10T12:26:13.133 に答える
0

これは、依存性注入ソリューションとモックの古典です。

多数の SMS ソリューションのいずれかを使用できるかのようにコードを記述します。

Send(recipient, message); というメソッドを使用して ISMS というインターフェイスを作成します。

次に、SMS を直接呼び出すコードに実装します。

SMS 機能が必要な場合は、使用する実装をインスタンス化し、そのコードに渡します。これで、SMS が何をどのように行うかは気にしなくなりました。

これを行う良い方法については、サービス ロケーター パターンをご覧ください。

単体テストに関しては、インターフェイスを実装するモック クラスを作成し、それを注入できます。SMS は送信しませんが、受信者とメッセージが有効であることを確認する場合がありますが、チーム全体にテスト データをスパム送信することはありません。

なぜ、いつ、どのメッセージが送信されているかは気にしないため、SMS 実装が機能することをテストします。

エンド ツー エンドのテストを行いたい場合、それはユニット テストではなく統合テストになります。

于 2013-02-10T12:43:28.910 に答える