1

私はこのようなインターフェースを持っています...

public interface ITempFileNameBuilder
{
    string DirectoryPath { get; }

    string FileName { get; }

    void GenerateNewFileName();
}

...そして、プロパティを新しいものGenerateNewFileNameに設定するようにメソッドをモックしたいと思います。2つの実装のように宣言されているため、インターフェイスに定義FileNameがないのは明らかなので、これは奇妙な要求であることを私は知っています。私はそれをしたので、あなたはプロパティを何か新しいものに設定するために呼び出す必要があります。setprivate set;GenerateNewFileNameFileName

これは可能ですか?

編集

これが私がテストしようとしている作業単位です。

public void StartRecording(string claimNo, string ip_no, string ip_name, IWaveIn input, Stream writer)
{
    if (this.IsRecording)
    {
        return;
    }

    if (_input != null)
    {
        _input.Dispose();
    }
    _input = input;

    _input.WaveFormat = _waveFormat;
    _input.DataAvailable += (s, args) =>
    {
        _writer.Write(args.Buffer, 0, args.BytesRecorded);
        byte[] buffer = args.Buffer;
        for (int index = 0; index < args.BytesRecorded; index += 2)
        {
            short sample = (short)((buffer[index + 1] << 8) | buffer[index + 0]);
            float sample32 = sample / 32768f;
            _aggregator.Add(sample32);
        }

        OnDataAvailable(args);
    };
    _input.RecordingStopped += (s, args) =>
    {
        _input.Dispose();
        _writer.Dispose();

        OnRecordingStopped(args);
    };

    if (this.CurrentRecording != null)
    {
        _tempFileNameBuilder.GenerateNewFileName();
    }

    this.Recordings.Add(new RecordingTrack(claimNo, ip_no, ip_name,
        _tempFileNameBuilder.FileName,
        _recordingDeployer,
        _recordingCompressor));
    if (this.MicrophoneLevel == default(float))
    {
        this.MicrophoneLevel = .75f;
    }

    _aggregator.Reset();
    _writer = writer;

    _input.StartRecording();
    this.IsRecording = true;
}

そして、この単体テストの目標はFileNameCurrentRecordingLastRecordingが実際に異なることを確認することです。これは、以前に発見したバグに基づく回帰テストです。FileNameのプロパティが設定されRecordingTrackておらず、インスタンスから電流を返すだけであったため、バグが発生していました。そのため、それが呼び出されたこと確認し、レコーディングトラックののセットが呼び出されたことを確認します。FileNameITempFileNameBuilderGenerateNewFileNameTempFileName

ただし、上のセットもプライベートであり、コンストラクターで実行されるため、これは実際には単体テストではなく、統合テストではないでしょうか。TempFileNameRecordingTrack

4

2 に答える 2

4

実装ではなく、インターフェースをモックしているのです。したがって、発信者がこれとどのように相互作用するかを気にする必要があります。GenerateNewFileName()呼び出してからアクセスすることを期待している場合はFileName、これら2つの呼び出しを期待して、適切な結果を返します(「生成された」ファイル名は何でもかまいません)。

ここで設定する「フィールド」はありません。APIについて話しているだけです。

もちろん、モックの代わりに偽物を簡単に作成して、代わりに使用することもできます。

于 2012-10-25T17:52:12.280 に答える
0

このような場合、プロパティで暗黙的に生成されたプライベートフィールドではなく、明示的なプライベートフィールドを使用する必要があります。実装がそのプライベートフィールドに関してプロパティのgetメソッドを定義していることを確認する必要があります。FileName

于 2012-10-25T17:51:09.070 に答える