C# NSubstitute仅自动模拟某些类型
我注意到NSubstitute自动模拟有以下类型:C# NSubstitute仅自动模拟某些类型,c#,nsubstitute,C#,Nsubstitute,我注意到NSubstitute自动模拟有以下类型: 排列 可观测 串 任务 虽然我知道会发生这种情况,但我找不到选择这些类型的原因。为什么不保留Stringnull?或者包括集合,而不仅仅是数组 例如: var crazyInterface = Substitute.For<ICrazyInterface>(); FileInfo[] folderContents = crazyInterface.FolderContents(@"C:\folder"); IObservabl
- 排列
- 可观测
- 串
- 任务
String
null?或者包括集合,而不仅仅是数组
例如:
var crazyInterface = Substitute.For<ICrazyInterface>();
FileInfo[] folderContents = crazyInterface.FolderContents(@"C:\folder");
IObservable<FileInfo> fileObserver = crazyInterface.CreateNewFileObservable();
string fileHash = crazyInterface.FileHash(@"C:\folder\file.txt");
Task<byte[]> fileContents = crazyInterface.ReadFileContentsAsync(@"C:\folder\file.txt");
var frazzyinterface=Substitute.For();
FileInfo[]folderContents=crazyInterface.folderContents(@“C:\folder”);
IObservable fileObserver=crazyInterface.CreateNewFileObservable();
字符串fileHash=crazyInterface.fileHash(@“C:\folder\file.txt”);
TaskFileContents=crazyInterface.ReadFileContentsAsync(@“C:\folder\file.txt”);
它们都得到一个为它们实现的mock,而List
将为null(或任何其他引用类型)
没有说明只是在文件夹中实现自动模拟的原因。简短回答:特定的自动模拟类型只是根据人们的需要添加的,我们认为,当预期会出现模拟或
默认值(T)
时,返回真实值所造成的任何混乱都比不上方便
如果有人感兴趣,这里有一个较长的,希望部分准确的故事,我记得这个功能的演变 NSubstitute开始返回所有内容的
default(T)
。对于调用链的情况,这会很痛苦,因此我们添加了接口类型的自动模拟。这是一个相当安全的操作-与类不同,没有可能运行真正的代码,比如说,从构造函数调用,或者无意中调用非虚拟方法。例如,mySub.SomeAutoSub().DoStuff()
可以运行真正的代码,也可以不运行,这取决于SomeAutoSub()
的返回类型
下一个安全级别是具有所有虚拟成员和默认构造函数的类。本文件将论文称为。拥有虚拟成员意味着,如果我们深入到一个自动子床实例中,就不能意外地调用真实代码。现在,它仍然会通过构造函数运行真正的代码,但它不带参数,因此我们可以假设(读:cross fingers and hope)默认行为会做一些合理的事情,而不是做一些糟糕的事情
最后,还有您指出的例外情况,如Array
和Task
。当我们觉得方便会超过任何引起的混乱时,这些都是根据反馈完全临时添加的。我们要避免的主要事情是在预期模拟时返回实际值。如果意外调用,NSubstitute将无法正常工作。对非模拟的对象返回
字符串
、数组
和任务
符合此标准。您不能模拟这些类型,因此在测试中使用一个合理的默认值似乎是合理的。我发现我经常遇到字符串操作,因为默认值为空,所以为了方便起见,我添加了那个字符串操作。其他人想要一个默认的
任务
,该任务工作合理,因此添加了该任务。我记不起不自动subbing集合背后的原因了(可能是因为有些人使用模拟版本的IList
,其中提供像List
这样的特定实现更容易显式存根?)
我认为我们可以避免一些不一致性,因为我们处于测试的环境中——如果我们需要一个特定的值或行为,我们将显式地将其删除。否则我们将得到一个默认值,希望它不会妨碍我们
如果您想要更多的东西自动子床,请ping。现在要做出这样可能会破坏性的更改有点困难,但如果某个特定类型有令人信服的理由,我们可以考虑将其添加进去。简短回答:特定的自动模拟类型是根据人们的需要添加的,我们觉得在模拟或修改时返回真实值所带来的任何混乱都会超过这种方便
默认值(T)
可能是预期值
如果有人感兴趣,这里有一个较长的,希望部分准确的故事,我记得这个功能的演变 NSubstitute开始返回所有内容的
default(T)
。对于调用链的情况,这会很痛苦,因此我们添加了接口类型的自动模拟。这是一个相当安全的操作-与类不同,没有可能运行真正的代码,比如说,从构造函数调用,或者无意中调用非虚拟方法。例如,mySub.SomeAutoSub().DoStuff()
可以运行真正的代码,也可以不运行,这取决于SomeAutoSub()
的返回类型
下一个安全级别是具有所有虚拟成员和默认构造函数的类。本文件将论文称为。拥有虚拟成员意味着,如果我们深入到一个自动子床实例中,就不能意外地调用真实代码。现在,它仍然会通过构造函数运行真正的代码,但它不带参数,因此我们可以假设(读:cross fingers and hope)默认行为会做一些合理的事情,而不是做一些糟糕的事情
最后,还有您指出的例外情况,如Array
和Task
。当我们觉得方便会超过任何引起的混乱时,这些都是根据反馈完全临时添加的。我们要避免的主要事情是在预期模拟时返回实际值。如果意外调用,NSubstitute将无法正常工作。对非模拟的对象返回
字符串
、数组
和任务
符合此标准。您不能模拟这些类型,因此在测试中使用一个合理的默认值似乎是合理的。我发现我经常遇到字符串操作,因为默认值为空,所以为了方便起见,我添加了那个字符串操作。其他人想要一个默认的任务
,该任务工作合理,因此