【发布时间】:2014-07-27 20:33:43
【问题描述】:
我正在使用 Entity Framework 6 并希望对我的一些业务逻辑代码进行单元测试。按照 Microsoft 的示例说明如何执行此操作,他们使用 MOQ 提供以下示例:
var mockSet = new Mock<DbSet<Blog>>();
var mockContext = new Mock<BloggingContext>();
mockContext.Setup(m => m.Blogs).Returns(mockSet.Object);
var service = new BlogService(mockContext.Object);
我正在使用FakeItEasy 而不是MOQ,我希望它会一样简单,但是FakeItEasy 抱怨它不能使用以下方法创建我的DbSet 的假冒:
var fakeDbSet = A.Fake<DbSet<InstalledProduct>>();
我得到一个异常如下:
FakeItEasy.Core.FakeCreationException:无法创建假的 输入“TN.Prs.Persistence.LicenseContext”。
以下是每个尝试的构造函数失败的原因列表: 没有构造函数参数失败: 在 TN.Prs.Persistence.LicenseContext 类型上找不到可用的默认构造函数。 在此调用期间捕获了异常。它的信息是: 访问被拒绝:'TN.Prs.Persistence.LicenseContext'。
在 FakeItEasy.Core.DefaultExceptionThrower.ThrowFailedToGenerateProxyWithResolvedConstructors(类型 typeOfFake, String reasonForFailureOfUnspecifiedConstructor, IEnumerable
1 resolvedConstructors) at FakeItEasy.Creation.FakeObjectCreator.TryCreateFakeWithDummyArgumentsForConstructor(Type typeOfFake, FakeOptions fakeOptions, IDummyValueCreationSession session, String failReasonForDefaultConstructor, Boolean throwOnFailure) at FakeItEasy.Creation.FakeObjectCreator.CreateFake(Type typeOfFake, FakeOptions fakeOptions, IDummyValueCreationSession session, Boolean throwOnFailure) at FakeItEasy.Creation.DefaultFakeAndDummyManager.CreateFake(Type typeOfFake, FakeOptions options) at FakeItEasy.Creation.DefaultFakeCreatorFacade.CreateFake[T](Action1 选项)在 FakeItEasy.A.FakeT TN.Prs.RegistrationServices.Specifications.when_activating_a_product_from_a_valid_digitally_signed_activation_key.<.ctor>b__0() 在
我的 POCO 类是 internal 而不是 public,但我已根据需要为 DynamicProxyGenAssembly2 添加了 InternalsVisibleTo 属性。当我公开课程时,一切正常,但我真的不想公开这些课程。如有任何建议,我将不胜感激。
这是我的上下文类:
internal class LicenseContext : DbContext
{
public LicenseContext()
{
}
public virtual DbSet<InstalledProduct> ManagedProducts { get; set; }
}
【问题讨论】:
-
我看不出这与实体框架有什么关系。这完全是 FakeItEasy 的问题,并且使用内部类,这将是您想要伪造的任何其他内部对象的问题。
-
@Yuliam 我很欣赏这种情绪,但请不要混淆我的缩进(我们一直使用白匠风格)。您可能认为您的偏好是一种改进,但您只是假设可以覆盖我的偏好,这有点傲慢。
-
@ErikFunkenbusch 如果您指的是 EntityFramework 标签,那么我将其包括在内,因为我觉得这是其他实体框架用户可能遇到的情况,并且其他人将来可能会遇到。我同意你的看法,但问题不直接出在实体框架上。
-
嗯,你的问题标题特别提到了
DbSet<T>,所以它看起来像是一个 EF 特定的问题。无论如何,您的程序集是否具有强名称?您将InternalsVisibleTo添加到包含内部类的程序集中,对吗?不是您的测试程序集? -
@ErikFunkenbusch 嗯,是的,我提到了 DbSet
因为这就是给我带来问题的原因,微软说它应该可以工作。我再次同意你的观点,绝对不是 EF 问题,我的代码总是有问题,但我喜欢尽可能多地提供上下文(请原谅双关语),因为我怀疑我会是唯一一个在尝试模拟 DbSet 时遇到这个问题,在你找到解决方案之前你永远不知道什么是重要的(顺便说一句,我现在有)。
标签: c# entity-framework mocking fakeiteasy