如何将模拟对象转换为原始CLR对象

时间:2015-04-14 10:29:28

标签: c# unit-testing casting moq

我的.cs文件中有一个代码,如下所示

public IfileGroup Placefile(int quantity, IFileGroup destfile, ILoc location)
{    
    fileGroup fg = null;
    cg = this.TransferFile(quantity, destfile as FileGroup, location);
}

所以在我的测试文件中,我创建了这样的模拟对象

Mock< IFileGroup > frp = new Mock< IFileGroup >();
frp.Setup(x => x.FileInfo).Returns("FileAvailable");
Mock<ILoc> locationMock;
locationMock.Setup(x => x.FileLocationId).Returns("10");

并调用函数

FileGroup target = new FileGroup ();    
var result = target.Placefile(4, frp.Object, locationMock.Object);

但是在调试时,当控制进入函数Placefile时,它将destfile传递为null,有没有办法从模拟对象向下转换为原始的CLR对象?

1 个答案:

答案 0 :(得分:0)

由于mock实现IFileGroup并且不从FileGroup继承,因此无法将其强制转换。

只有当您的FileGroup类是抽象的或提供虚拟方法时,才能创建可以强制转换为FileGroup的模拟。这是您的基本.NET继承。

相反,您的代码不应该依赖FileGroup,而应该始终依赖IFileGroup。因此,对TransferFile的调用应如下所示:

 this.TransferFile(quantity, destfile as IFileGroup, location);

我怀疑您可能需要更新TransferFile的签名才能生效。或者改为创建一个新的FileGroup对象而不是强制转换,因为强制转换不能保证工作:

 this.TransferFile(quantity, new FileGroup(destfile), location);

不是需要更改的Mocking或Casting,您需要进一步重构您的API,以使其真正可测试。