Dre*_*sel 5 c# unit-testing microsoft-fakes
是否有可能使用Microsoft Fakes隔离/替换类的构造函数?
在为Mole(Fakes的前身)找到了一个例子:http://thecurlybrace.blogspot.co.at/2011/11/how-do-i-detour-mole-type-constructor.html
我试过像这样的结构
ShimStreamReader.Constructor = @this => ShimStreamReader.ConstructorString(@this, "Test");
Run Code Online (Sandbox Code Playgroud)
但它说缺少get访问器.为了澄清它,更换类似的东西会很好
new StreamReader("filename")
Run Code Online (Sandbox Code Playgroud)
像这样的静态输入
new StreamReader(new MemoryStream(Encoding.Default.GetBytes("33\r\n1\r\n16\r\n5\r\n7")))
Run Code Online (Sandbox Code Playgroud)
所以我不必模拟Read,ReadLine等.
using (ShimsContext.Create())
{
ShimStreamReader.ConstructorString =
delegate(StreamReader @this, string @string)
{
var shim = new ShimStreamReader(@this);
shim.Read = () => 42;
};
var target = new StreamReader("MeaningOfLife.txt");
Assert.AreEqual(42, target.Read());
}
Run Code Online (Sandbox Code Playgroud)
可以通过反射替换并调用不同的构造函数:
“因此,当您替换构造函数时,您应该在构造函数中进行所有初始化。对于 StreamReader 构造函数来说,这可能是不可能的,因为您不知道对象是如何由原始构造函数在内部初始化的,并且您无权访问 private对象的成员。
因此,我们可以使用反射来调用原始构造函数来初始化对象,然后使用它。” - 请参阅 Vikram Agrawals 在http://social.msdn.microsoft.com上的回答
因此,关于我的问题的代码如下所示:
ShimStreamReader.ConstructorString = (@this, value) =>
{
ConstructorInfo constructor = typeof (StreamReader).GetConstructor(new[] {typeof (Stream)});
constructor.Invoke(@this, new object[] {new MemoryStream(Encoding.Default.GetBytes("33\r\n1\r\n16\r\n5\r\n7"))});
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7238 次 |
| 最近记录: |