使用系统库对服务进行单元测试

问题描述 投票:2回答:3

我目前正在编写我正在编写的“ PluginsService”。我需要使用Assembly,AssemblyName,Directory和File的系统库。目前,我正在为每个接口创建包装器接口,因此可以在测试中模拟它们。但是,这确实意味着我必须在服务中注入很多包装器。

例如,当测试在文件夹中搜索某些插件的方法时,我正在执行此操作

With.Mocks(mockery)
    .Expecting(() =>
    {
            Expect.Call(directory.GetFiles(PLUGINPATH, PLUGINSEARCHPATTERN)).IgnoreArguments().Return(pluginLibraries);
            Expect.Call(file.ReadAllBytes(null)).IgnoreArguments().Return(bytes);
               Expect.Call(assemblyName.GetAssemblyName("fileName")).IgnoreArguments().Return(name);
            Expect.Call(assembly.GetExecutingAssembly()).Return(executingAssembly);
    })
    .Verify(() => result = service.FindAvailablePlugins());

我有2个问题:

  1. 是否有更好的方法来处理TDD的系统库项目?
  2. 是否有4个项目要注入一类?
c# unit-testing tdd
3个回答
1
投票
如果您朝这个方向发展,我想您会发现您的设计变得更加流畅,集成点也更容易。面对现实,.NET File IO类不是为可测试性而设计的。因此,提出自己的想法。您可以模拟新的Directory类,或者做我所做的事情,只有假的Boundary类和您注入的某种形式的创建者。

希望有所帮助。


0
投票
public static class SystemTime { public static Func<DateTime> Now = () => DateTime.Now; }

然后在测试中:

SystemTime.Now = () => new DateTime(2000,1,1);
repository.ResetFailures(failedMsgs); 
SystemTime.Now = () => new DateTime(2000,1,2);
var msgs = repository.GetAllReadyMessages(); 
Assert.AreEqual(2, msgs.Length);

这是注入的替代方法,但不是线程安全的。Dealing with time in tests


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.