我正在使用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:创建假的失败 输入&#34; TN.Prs.Persistence.LicenseContext&#34;。
以下列出了每个尝试构造函数失败的原因: 没有构造函数参数失败: 在TN.Prs.Persistence.LicenseContext类型上找不到可用的默认构造函数。 在此次通话中遇到了异常。它的信息是: 访问被拒绝:&#39; TN.Prs.Persistence.LicenseContext&#39;。
在 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](Action
1 选项)在FakeItEasy.A.FakeT at TN.Prs.RegistrationServices.Specifications.when_activating_a_product_from_a_valid_digitally_signed_activation_key&LT; .ctor&GT; b__0() 在
我的POCO课程为internal
而不是public
,但我已为InternalsVisibleTo
添加DynamicProxyGenAssembly2
属性。当我公开课程时,一切正常,但我真的不想公开公开这些课程。我很感激任何建议。
这是我的上下文类:
internal class LicenseContext : DbContext
{
public LicenseContext()
{
}
public virtual DbSet<InstalledProduct> ManagedProducts { get; set; }
}
答案 0 :(得分:1)
问题解决了!
在我添加InternalsVisibleTo属性之前,FakeItEasy抱怨并告诉我添加这些属性,我很高兴看到它在错误消息中提供了我需要的确切代码。我甚至对我的一位同事说过,&#34; 现在那个就是我所说的错误信息!&#34;。它建议的属性是:
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")]
不幸的是,这不起作用,我得到一个“拒绝访问”#39;错误。可能是公钥不正确,但由于我的程序集名称不强,我只是从属性中删除了公钥,一切正常。
最终我必须强化我的程序集,所以我最终必须解决这个公钥问题,但我知道该怎么做,所以它不应成为障碍。