当类是内部的时候,如何使用FakeItEasy伪造DbSet <t>?</t>

时间:2014-07-27 20:33:44

标签: c# entity-framework mocking fakeiteasy

我正在使用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; }
}

1 个答案:

答案 0 :(得分:1)

问题解决了!

在我添加InternalsVisibleTo属性之前,FakeItEasy抱怨并告诉我添加这些属性,我很高兴看到它在错误消息中提供了我需要的确切代码。我甚至对我的一位同事说过,&#34; 现在那个就是我所说的错误信息!&#34;。它建议的属性是:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")]

不幸的是,这不起作用,我得到一个“拒绝访问”#39;错误。可能是公钥不正确,但由于我的程序集名称不强,我只是从属性中删除了公钥,一切正常。

最终我必须强化我的程序集,所以我最终必须解决这个公钥问题,但我知道该怎么做,所以它不应成为障碍。