【发布时间】:2020-10-04 22:48:22
【问题描述】:
由于接口的显式转换错误,我遇到了单元测试失败的问题。
我不确定是否有解决方案,但我还没有找到一个足够清晰的解决方案。
在我的构造函数中,我传递了数据模型IAssetDataModel theAssetDataModel 的接口。然后后来我明确地将Idatamodel 转换为我的具体实现。这在我的单元测试中无法在运行时执行。
public EventFinder(IEventFinder Successor,
IAssetDataModel theAssetDataModel,
IAssetEventHandler theEventHandler)
: base(Successor, theAssetDataModel, theEventHandler) {}
// later on I make this cast to call the method I need
List stuff = ((IMyOtherDataModel)_AssetDataModel).GetListOfStuff();
这是它在我的单元测试中失败的地方...我有一个此方法的存根,但它在运行时显式转换失败,我不确定为什么。
我在单元测试中创建了这个模型的存根,但仍然失败。
var stub_my_Data_model = new StubImyAssetDataModel();
stub_my_Data_model.Getstuff = () =>
{
List<string> results = new List<string>();
results.Add("test1");
return results;
};
【问题讨论】:
-
嗯,你传递的东西可能不是
IMyOtherDataModel,所以转换失败。你为什么期望它起作用?更重要的是,如果您稍后假设它必须是IMyOtherDataModel,为什么您的构造函数只使用IAssetDataModel? -
感谢您的回复。我知道这看起来很奇怪,但我仍然无法绕过它,我知道有一个解决方案。 IAssetDataModel 是所有其他数据模型继承的接口。这为调用它的方法提供了灵活性。由于其他方法的继承,我无法传递 MyDataModel。再次感谢您的回复
-
您并没有真的为调用者提供灵活性。你给人一种灵活性的错觉。你说,“当然,给我你想要的任何数据模型。没关系。如果你没有给我我真正需要的那种数据模型,我会等到稍后我失败。”为什么要接受实际上无法使用的值?
-
感谢@Jon Skeet!感谢您的回复,我能够找到解决方案。我知道这个模型原则上看起来像是一种幻觉,但我向你保证它会像我描述的那样工作。
-
除非它显然不履行签名的承诺,否则你不会有这个错误。我强烈建议您重新考虑您的方法。
标签: c# unit-testing interface