2014-11-08 82 views
0

我有我的代碼中稱爲BlahBlahDataContext實體框架DBContext的以下子類。 我們需要使用Moq Framework來模擬測試的子類。爲什麼Moq框架無法看到屬於類模擬對象的方法?

namespace BlahBlahExample.Data 
{ 
    using System; 
    using System.Linq; 
    using System.Data.Entity; 
    using System.Data.Entity.Infrastructure; 
    using AutoMapper; 
    using BlahBlah.Framework.Audit; 
    using BlahBlah.Framework.Audit.Contracts; 
    using BlahBlah.Framework.Core.Contracts; 
    using BlahBlah.Framework.Core.Strategy; 
    using BlahBlah.Framework.EntityFramework; 
    using BlahBlahExample.Domain.Objects; 

public partial class BlahBlahDataContext : DbContext, IRepositoryFactory, IDataContext 
{ 
     private readonly IAuditMappingProvider _providerAuditMapping; 
     private IStrategyContainer _strategyContainer; 

    public BlahBlahDataContext() 
     : base("name=NorthwindModel") 
    { 
      Database.Log = Log; 

    } // end empty constructor 

    public BlahBlahDataContext(IAuditMappingProvider providerAuditMapping) 
    { 
     _providerAuditMapping = providerAuditMapping; 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     throw new UnintentionalCodeFirstException(); 
    } 

    private void BindAuditStrategyDynamic(dynamic repository) 
    { 
     BindAuditStrategy(repository); 
    } 

        // codeStringGenerator.DbSet(entitySet).Replace("_", "") 
    public virtual DbSet<Category> Categories { get; set; } 
        // codeStringGenerator.DbSet(entitySet).Replace("_", "") 
    public virtual DbSet<CustomerDemographic> CustomerDemographics { get; set; } 
        // codeStringGenerator.DbSet(entitySet).Replace("_", "") 
    public virtual DbSet<Customer> Customers { get; set; } 
        // codeStringGenerator.DbSet(entitySet).Replace("_", "") 
    public virtual DbSet<Employee> Employees { get; set; } 
        // codeStringGenerator.DbSet(entitySet).Replace("_", "") 
    public virtual DbSet<Order_Detail> Order_Details { get; set; } 
        // codeStringGenerator.DbSet(entitySet).Replace("_", "") 
    public virtual DbSet<Order> Orders { get; set; } 
        // codeStringGenerator.DbSet(entitySet).Replace("_", "") 
    public virtual DbSet<Product> Products { get; set; } 
        // codeStringGenerator.DbSet(entitySet).Replace("_", "") 
    public virtual DbSet<Region> Regions { get; set; } 
        // codeStringGenerator.DbSet(entitySet).Replace("_", "") 
    public virtual DbSet<Shipper> Shippers { get; set; } 
        // codeStringGenerator.DbSet(entitySet).Replace("_", "") 
    public virtual DbSet<Supplier> Suppliers { get; set; } 
        // codeStringGenerator.DbSet(entitySet).Replace("_", "") 
    public virtual DbSet<Territory> Territories { get; set; } 
        // codeStringGenerator.DbSet(entitySet).Replace("_", "") 
    public virtual DbSet<Account> Accounts { get; set; } 
        // codeStringGenerator.DbSet(entitySet).Replace("_", "") 
    public virtual DbSet<AccountRole> AccountRoles { get; set; } 
        // codeStringGenerator.DbSet(entitySet).Replace("_", "") 
    public virtual DbSet<AccountRoleMap> AccountRoleMaps { get; set; } 



     private void BindAuditStrategy(IRepository<CustomerDemographic> repository) 
     { 
      Mapper.CreateMap<CustomerDemographic, CustomerDemographicAudit>(); 

      var auditStrategy = new AuditStrategy<CustomerDemographic, CustomerDemographicAudit>(
       this, 
       new BlahBlahAuditContext(), 
       _providerAuditMapping, 
       Mapper.Map<CustomerDemographicAudit>); 

      auditStrategy.Attach(repository); 
     } 


     private void BindAuditStrategy(IRepository<Customer> repository) 
     { 
      Mapper.CreateMap<Customer, CustomerAudit>(); 

      var auditStrategy = new AuditStrategy<Customer, CustomerAudit>(
       this, 
       new BlahBlahAuditContext(), 
       _providerAuditMapping, 
       Mapper.Map<CustomerAudit>); 

      auditStrategy.Attach(repository); 
     } 


     private void BindAuditStrategy(IRepository<Order> repository) 
     { 
      Mapper.CreateMap<Order, OrderAudit>(); 

      var auditStrategy = new AuditStrategy<Order, OrderAudit>(
       this, 
       new BlahBlahAuditContext(), 
       _providerAuditMapping, 
       Mapper.Map<OrderAudit>); 

      auditStrategy.Attach(repository); 
     } 


     public virtual IRepository<TEntity> CreateRepository<TEntity>(IRepository useRepositoryContext = null) where TEntity : class 
     { 
      var context = (useRepositoryContext == null ? new BlahBlahDataContext() : useRepositoryContext.Context as IDataContext) ?? new BlahBlahDataContext(); 

      var repository = new EntityFrameworkRepository<TEntity>(context); 

      if (_providerAuditMapping.Classes.Any(λ => λ.EntityType == typeof (TEntity))) 
      { 
       BindAuditStrategyDynamic(repository); 
      } 

      return repository; 
     } 

     public IStrategyContainer StrategyContainer 
     { 
      get 
      { 
       return _strategyContainer ?? (_strategyContainer = new BaseStrategyContainer()); 
      } 
     } 

     public event EventHandler<string> OnLog; 
     private void Log(string message) 
     { 
      if (OnLog != null) 
      { 
       OnLog(this, message); 
      } 
     } 
    } 
} 

我們需要使用起訂量框架嘲笑用於測試的子類。

在我的測試代碼中,我們有下面的代碼:

Mock<BlahBlahDataContext> fctry = new Mock<BlahBlahDataContext>(mappingProvider); 

但是,如果我嘗試一前一後,立即鍵入以下行,它無法識別CreateRepository方法

fctry.CreateRepository 

爲什麼moq的Mock看不到CreateRepository方法?

+1

var service = new Mock<IService>(); service.Setup(s => s.GetData()).Returns("test data"); 

之後,您可以通過service.Object屬性訪問實際的嘲笑對象該方法在'fctry.Object.CreateRepository'。在你給它打電話之前,你應該設置一些東西。由於這個方法是'虛擬'(也可能是一個非'密封'覆蓋'),如果你使用'安裝',Moq可以改變它的行爲。如果你在沒有設置的情況下調用它,你會得到默認值('null'),因爲你的模擬是'Loose'。您可以將默認設置更改爲新的「Loose」模擬。您也可以將'CallBase'更改爲'true',在這種情況下將調用原始實現。如果你想要一個錯誤,把'MockBehavior'從'Loose'改爲'Strict'。 – 2014-11-09 11:26:20

回答

4

Mock<T>給你,你想用Setup()方法來嘲笑各地實際T類的包裝:

IService mocked = service.Object; 
string data = mocked.GetData(); // returns "test data" string 
+0

這就是爲什麼我將模擬命名爲serviceMock和service = serviceMock.Object; – Andy 2014-11-08 17:24:28

相關問題