返回不同的Decended类型

时间:2018-03-11 00:15:51

标签: c# entity-framework generics mocking tdd

背景: 尝试使用Entity Framework为项目创建模拟数据。

我想我需要返回关闭的对象图(除非有更好的方法):

有3个类都来自EntityBase,即

class TA : EntityBase
class TB : EntityBase
class TC : EntityBase

TA有两个虚拟属性:

public virtual TB B { get; set; }
public virtual ICollection<TC> C { get; set; }

TB已经

public virtual ICollection<TA> A { get; set; }

TC已

public virtual TA A { get; set; }

在某些地方,我需要TA或TB或TC的实例化对象。

一旦我完全手工制作要返回的TA实例,并且手动填充B和C的所有属性,而不是使用相同功能的3个副本来返回A或B或C,是否有办法拥有实例化A实例的方法的一个副本,但也返回B或C.

喜欢的东西

Get<A>(),或Get<B>()Get<C>()

当然,如果有更简单的模拟实体的标准方法,则可能不需要这些。

1 个答案:

答案 0 :(得分:1)

你可能最好只创建三种方法。

要使用一种方法执行此操作,您需要返回类型为EntityBase的对象,因为它们都继承了该对象。

public EntityBase MyMethod() {
    //return TA or TB or TC
}

但是,您可能还有其他类型从EntityBase继承,因此在技术上可以返回其他类型。

如果你需要阻止它,你可以创建一个继承自EntityBase的另一种类型,然后让你的三个类(只有那三个类)从中继承。

class MyEntityBase : EntityBase
class TA : MyEntityBase
class TB : MyEntityBase
class TC : MyEntityBase

public MyEntityBase MyMethod() {
    //return TA or TB or TC
}

但无论您是否这样做,您仍应确认返回哪种类型并采取相应行动。

var result = MyMethod()
if (result is TA myTA) {
    //do something with myTA
}

当然,你可以放弃所有的测试,并假设你得到了正确的价值,这很可能会起作用.....但它要求在未来打破一些东西:)