【问题标题】:unit testing explicit cast error on interface单元测试接口上的显式转换错误
【发布时间】: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


【解决方案1】:

我做了一些挖掘,答案是在从接口派生的测试类中创建数据模型的实现。

public class TestDataModel : IMyInterface{}

【讨论】:

    【解决方案2】:

    你在存根 Getstuff 而不是 GetListOfStuff - 也许这就是问题所在?

    【讨论】:

    • 请避免在回答中提问。他们有被标记为“不回答”的风险。
    【解决方案3】:

    对于未来有此问题的人。我最近遇到了从IEnumerable&lt;IBlah&gt; 转换为IEnumerable&lt;Blah&gt; 的问题。我解决它的方法是使用 linq select 语句,并在我遍历它时强制转换每个语句。像这样:

    var interfaceValues = service.returnIBlahItems();
    var castedValues = interfaceValues.Select(item => (Blah) item);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-01
      • 2023-03-26
      • 2012-11-27
      • 1970-01-01
      • 2021-03-24
      • 2014-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多