在实现中设置私有设置器的模拟void方法

时间:2012-10-25 17:48:46

标签: c# visual-studio-2010 unit-testing moq

我有一个看起来像这样的界面......

public interface ITempFileNameBuilder
{
    string DirectoryPath { get; }

    string FileName { get; }

    void GenerateNewFileName();
}

...我想模拟GenerateNewFileName方法,以便将FileName属性设置为新的属性。我知道这是一个奇怪的请求,因为很明显接口中没有定义set因为它在两个实现中被声明为private 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;
}

此单元测试的目标是确保FileNameCurrentRecording的{​​{1}}实际上不同。这是基于我们之前发现的错误的回归测试。该错误发生了,因为LastRecording上的FileName属性未被设置,而只是从RecordingTrack实例返回当前FileName所以我们的想法是确保ITempFileNameBuilder被称为并且确保调用记录轨道上GenerateNewFileName设置

然而,TempFileName上的TempFileName上的设置也是私有的,它是在构造函数中完成的,所以这可能不是单元测试而且更多那么集成测试呢?

2 个答案:

答案 0 :(得分:4)

你在嘲笑界面,而不是实现。所以你应该关心调用者如何与之交互。如果您希望他们拨打GenerateNewFileName()然后访问FileName,只需要这两个电话并给出相应的结果(“生成的”文件名可以是任何内容)。

这里没有设置“字段” - 你只是谈论API。

当然,你可以轻松创建一个而不是模拟,然后使用它。

答案 1 :(得分:0)

在这种情况下,您需要使用显式私有字段而不是属性中隐式生成的字段。您需要确保实现根据该私有字段为get属性定义FileName方法。