【问题标题】:How to cast mock object to original CLR object如何将模拟对象转换为原始 CLR 对象
【发布时间】:2015-04-14 10:29:28
【问题描述】:

我的 .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 对象?

【问题讨论】:

    标签: c# unit-testing casting moq


    【解决方案1】:

    由于 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 以使其真正可测试。

    【讨论】:

      猜你喜欢
      • 2015-12-19
      • 1970-01-01
      • 2013-01-12
      • 2014-07-24
      • 2016-07-07
      • 1970-01-01
      • 2011-05-01
      • 2010-09-24
      相关资源
      最近更新 更多