为什么Moq框架无法看到属于类模拟对象的方法?
问题描述:
我有我的代码中称为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
方法?
答
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
:
之后,您可以通过
service.Object
属性访问实际的嘲笑对象该方法在'fctry.Object.CreateRepository'。在你给它打电话之前,你应该设置一些东西。由于这个方法是'虚拟'(也可能是一个非'密封'覆盖'),如果你使用'安装',Moq可以改变它的行为。如果你在没有设置的情况下调用它,你会得到默认值('null'),因为你的模拟是'Loose'。您可以将默认设置更改为新的“Loose”模拟。您也可以将'CallBase'更改为'true',在这种情况下将调用原始实现。如果你想要一个错误,把'MockBehavior'从'Loose'改为'Strict'。 – 2014-11-09 11:26:20