1

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

public interface ITempFileNameBuilder
{
    string DirectoryPath { get; }

    string FileName { get; }

    void GenerateNewFileName();
}

...我想模拟该GenerateNewFileName方法,以便将FileName属性设置为新的东西。我知道这是一个奇怪的请求,因为接口中显然没有set定义,因为它是private set;在两个实现中声明的。我这样做了,所以您必须调用GenerateNewFileName以将FileName属性设置为新的。

这可能吗?

编辑

这是我要测试的工作单元。

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;
}

而这个单元测试的目标是确保FileName和实际上是不同的。这是基于我们之前发现的错误的回归测试。发生该错误是因为未设置上的属性,而只是从实例返回当前电流,因此我们的想法是确保调用该属性确保调用了录制轨道上的设置。CurrentRecordingLastRecordingFileNameRecordingTrackFileNameITempFileNameBuilderGenerateNewFileNameTempFileName

但是,on上的集合也是私有的,它是在构造函数中完成的,所以也许这不是真正的单元测试,而更像是集成测试?TempFileNameRecordingTrack

4

2 回答 2

4

你在嘲笑接口,而不是实现。所以你应该关心调用者如何与之交互。如果您希望他们先调用GenerateNewFileName()然后访问FileName,则只需期望这两个调用并返回适当的结果(其中“生成的”文件名可以是任何东西)。

这里没有要设置的“字段”——你只是在谈论一个 API。

当然,您可以轻松地创建一个而不是模拟,并使用它来代替。

于 2012-10-25T17:52:12.280 回答
0

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

于 2012-10-25T17:51:09.070 回答