我有一个看起来像这样的界面......
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
和CurrentRecording
的{{1}}实际上不同。这是基于我们之前发现的错误的回归测试。该错误发生了,因为LastRecording
上的FileName
属性未被设置,而只是从RecordingTrack
实例返回当前FileName
所以我们的想法是确保ITempFileNameBuilder
被称为并且确保调用记录轨道上GenerateNewFileName
的设置。
然而,TempFileName
上的TempFileName
上的设置也是私有的,它是在构造函数中完成的,所以这可能不是单元测试而且更多那么集成测试呢?
答案 0 :(得分:4)
你在嘲笑界面,而不是实现。所以你应该关心调用者如何与之交互。如果您希望他们拨打GenerateNewFileName()
然后访问FileName
,只需要这两个电话并给出相应的结果(“生成的”文件名可以是任何内容)。
这里没有设置“字段” - 你只是谈论API。
当然,你可以轻松创建一个假而不是模拟,然后使用它。
答案 1 :(得分:0)
在这种情况下,您需要使用显式私有字段而不是属性中隐式生成的字段。您需要确保实现根据该私有字段为get
属性定义FileName
方法。