C# 为什么Moq框架看不到属于模拟对象类的方法?

C# 为什么Moq框架看不到属于模拟对象类的方法?,c#,asp.net,entity-framework,unit-testing,moq,C#,Asp.net,Entity Framework,Unit Testing,Moq,我的代码中有实体框架DBContext的以下子类,称为BlahBlahDataContext。 我们需要使用Moq框架来模拟子类进行测试 namespace BlahBlahExample.Data { using System; using System.Linq; using System.Data.Entity; using System.Data.Entity.Infrastructure; using AutoMapper; using

我的代码中有实体框架DBContext的以下子类,称为BlahBlahDataContext。 我们需要使用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);
            }
        }
    }
}
为什么moq的Mock没有看到
CreateRepository
方法?

Mock
为您提供了一个实际
t
类的包装,您希望使用
Setup()
方法对其进行模拟:

var service = new Mock<IService>();
service.Setup(s => s.GetData()).Returns("test data");
Mock
为实际的
T
类提供了一个包装器,您要使用
Setup()
方法模拟该类:

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

这就是为什么我将Mock命名为serviceMock,service=serviceMock.Object;这就是为什么我将Mock命名为serviceMock,service=serviceMock.Object;该方法位于
fctry.Object.CreateRepository
。在调用它之前,您应该
Setup
stuff。由于此方法是
虚拟的
(也可能是非
密封的
覆盖
),如果您
设置
,Moq可以更改其行为。如果在没有设置的情况下调用它,您将获得默认值(即
null
),因为您的模拟是
松散的
。您可以将默认设置更改为新的
Loose
mock。您还可以将
CallBase
更改为
true
,在这种情况下,将调用原始实现。如果需要错误,请将
MockBehavior
Loose
更改为
Strict
。方法位于
fctry.Object.CreateRepository
。在调用它之前,您应该
Setup
stuff。由于此方法是
虚拟的
(也可能是非
密封的
覆盖
),如果您
设置
,Moq可以更改其行为。如果在没有设置的情况下调用它,您将获得默认值(即
null
),因为您的模拟是
松散的
。您可以将默认设置更改为新的
Loose
mock。您还可以将
CallBase
更改为
true
,在这种情况下,将调用原始实现。如果需要错误,请将
MockBehavior
Loose
更改为
Strict
var service = new Mock<IService>();
service.Setup(s => s.GetData()).Returns("test data");
IService mocked = service.Object;
string data = mocked.GetData(); // returns "test data" string