18

System.Net.Mail.SmtpClientMS-Test UnitTest で偽造するために使用したい。そのため、System.dll の Fakes Assembmly を追加しました。次に、 と を作成しShimsContextますStubSmtpClient

using (ShimsContext.Create())
{
   StubSmtpClient client = new StubSmtpClient();               
}

しかし、私はそれで何をしますか?最終的な目標は、send メソッドが のオブジェクトで呼び出されることを期待するテストを作成することですMailMessage

4

4 に答える 4

8

これは実際にはあなたの質問に対する答えではありませんが、別のアプローチです:

app.config で、ローカル ディレクトリにメールをファイルとして配信するように smtp 設定をセットアップします。次に、ファイルをロードして assert セクションの内容を確認できます。

アサーション用にもう少しコードを書く必要があります (またはできればいくつかのヘルパー関数を作成する必要があります) が、製品コードに影響することは何もする必要はありません。

于 2013-11-14T06:52:32.590 に答える
6

もう 1 つの方法は、nDumbsterを使用することです。

Install-Package nDumbster

メモリ内で Smtp サーバーを実行し、それに対して検証することができます。SmtpClientそれはより統合テストに変わりますが、使用法も正しいことをテストしたいので、一般的にそれらは単体テストよりも価値があります。

于 2015-08-06T19:36:14.823 に答える
1

を正しく処分するTeoman shipahiによるこの回答のバージョン。SmtpClient

最初にISmtpClient継承を行いIDisposableます:

public interface ISmtpClient : IDisposable
{
    void Send(MailMessage mailMessage);
}

IDisposable次に、SmtpClientWrapperクラスに実装します。

public class SmtpClientWrapper : ISmtpClient
{
    private bool disposed;
    private readonly SmtpClient smtpClient;

    public SmtpClientWrapper(string host, int port)
    {
        smtpClient = new SmtpClient(host, port);
    }

    ~SmtpClientWrapper()
    {
        Dispose(false);
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                smtpClient?.Dispose();
            }
            disposed = true;
        }
    }

    protected void CheckDisposed()
    {
        if (disposed)
        {
            throw new ObjectDisposedException(nameof(SmtpClientWrapper));
        }
    }

    public void Send(MailMessage mailMessage)
    {
        CheckDisposed();
        smtpClient.Send(mailMessage);
    }
}

このバージョンのでは、プロパティのセッターで置き換えたときにオブジェクトが破棄されないという問題を回避するためにSmtpClientWrapper、プロパティを削除しました。SmtpClientSmtpClientSmtpClient

于 2018-04-06T17:52:20.617 に答える