C# 通过不使用表达式逻辑的Moq测试表达式树方法

C# 通过不使用表达式逻辑的Moq测试表达式树方法,c#,nunit,moq,expression-trees,C#,Nunit,Moq,Expression Trees,问题是:直接运行代码会创建正确的筛选,而我的单元测试根本不进行筛选(返回模拟存储库中的所有记录) 我不知道测试中的表达式逻辑是不是搞错了什么,但不管我设置了什么标准,模拟存储库都不会在ad上过滤,我可以返回“所有”记录。这在调用它的服务层上100%起作用,但在测试中不起作用 编辑:很抱歉对代码进行了格式化,我再也找不到更好的了 代码: public abstract class EFRepository<T> : IRepository<T> where T : Base

问题是:直接运行代码会创建正确的筛选,而我的单元测试根本不进行筛选(返回模拟存储库中的所有记录)

我不知道测试中的表达式逻辑是不是搞错了什么,但不管我设置了什么标准,模拟存储库都不会在ad上过滤,我可以返回“所有”记录。这在调用它的服务层上100%起作用,但在测试中不起作用

编辑:很抱歉对代码进行了格式化,我再也找不到更好的了

代码

public abstract class EFRepository<T> : IRepository<T> where T : BaseEFModel {

public IUnitOfWork UnitOfWork { get; set; }

private IDbSet<T> _objectset;
private IDbSet<T> ObjectSet
{
    get { return _objectset ?? (_objectset = UnitOfWork.Context.Set<T>()); }
}

public virtual IQueryable<T> WhereInternal(Expression<Func<T, bool>> expression)
{
    return ObjectSet.Where(expression);
} } 
公共抽象类eRepository:IRepository,其中T:BaseEFModel{
公共IUNITOWORK UNITOWORK{get;set;}
私有IDbSet_对象集;
私有IDbSet对象集
{
获取{return}objectset???(_objectset=UnitOfWork.Context.Set());}
}
公共虚拟IQueryable WhereInternal(表达式)
{
返回ObjectSet.Where(表达式);
} } 
实施:

public class DoNotSolicitRepo : EFRepository<DoNotSolicit>, IDoNotSolicitRepo {
private readonly RestUnitOfWork worker;

public DoNotSolicitRepo(RestUnitOfWork _worker)
{
    worker = _worker;
}

public IList<DNSContract> SelectWithCriteria(DNS_Search search)
{
    // create the where clause 
    Expression<Func<DoNotSolicit, bool>> whereClause = c => (
        (String.IsNullOrEmpty(search.FirstName) || c.FirstName.StartsWith(search.FirstName)) &&
        (String.IsNullOrEmpty(search.LastName) || c.LastName.StartsWith(search.LastName)) &&
        (String.IsNullOrEmpty(search.Address1) || c.Address1.Contains(search.Address1)) &&
        (String.IsNullOrEmpty(search.Address2) || c.Address2.Contains(search.Address2)) &&
        (String.IsNullOrEmpty(search.City) || c.City.Contains(search.City)) &&
        (String.IsNullOrEmpty(search.State) || c.State.Equals(search.State)) &&
        (String.IsNullOrEmpty(search.Zip5) || c.Zip.Equals(search.Zip5)) &&
        (String.IsNullOrEmpty(search.Phone) || c.Phone.Equals(search.Phone)) &&
        (String.IsNullOrEmpty(search.Email) || c.Email.Equals(search.Email))
        );

    using (var scope = worker)
    {
        scope.Register(this);
        var resultList = WhereInternal(whereClause).ToList();

        Mapper.CreateMap<DoNotSolicit, DNSContract>()
           .ForMember(dest => dest.PartnerCode, opt => opt.Ignore())
           .ForMember(dest => dest.PartnerDescription, opt => opt.Ignore())
           .ForMember(dest => dest.DoNotSolicitReason, opt => opt.Ignore())
           .ForMember(dest => dest.SaveDate, opt => opt.Ignore())
           .ForMember(dest => dest.InsertDT, opt => opt.Ignore());

         var returnObj = Mapper.Map<IList<DoNotSolicit>, IList<DNSContract>>(resultList);

         return returnObj.FriendlySaveDates();
    }
} }
[TestFixture] public class DNSRepoTest : BaseEFUnitFixture<DoNotSolicit> {
private readonly List<DoNotSolicit> list = new List<DoNotSolicit>();

private class Search
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip5 { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }
}

private Expression<Func<DoNotSolicit, bool>> SearchBuilder(Search search)
{
    //  same as repo logic
    Expression<Func<DoNotSolicit, bool>> whereClause = c => (
       (String.IsNullOrEmpty(search.FirstName) || c.FirstName.StartsWith(search.FirstName)) &&
       (String.IsNullOrEmpty(search.LastName) || c.LastName.StartsWith(search.LastName)) &&
       (String.IsNullOrEmpty(search.Address1) || c.Address1.Contains(search.Address1)) &&
       (String.IsNullOrEmpty(search.Address2) || c.Address2.Contains(search.Address2)) &&
       (String.IsNullOrEmpty(search.City) || c.City.Contains(search.City)) &&
       (String.IsNullOrEmpty(search.State) || c.State.Equals(search.State)) &&
       (String.IsNullOrEmpty(search.Zip5) || c.Zip.Equals(search.Zip5)) &&
       (String.IsNullOrEmpty(search.Phone) || c.Phone.Equals(search.Phone)) &&
       (String.IsNullOrEmpty(search.Email) || c.Email.Equals(search.Email))
       );

    return whereClause;
}

[TestFixtureSetUp]
public void Init()
{
    list.Add(new DoNotSolicit
                 {
                     DoNotSolicitID = 4,
                     FirstName = "nunit",
                     Origination = "testing"
                 });

    mockedEFRepo = MockedEFRepositiory();
    mockedEFRepo.Object.AddInternal(list);
}

[Test]
public void SelectWithCriteria_FirstNameMatch()
{
    var clause = SearchBuilder(new Search{FirstName = "test"});
    var results = mockedEFRepo.Object.WhereInternal(clause).ToList();

    Assert.IsNotNull(results);
    Assert.IsTrue(results.Count < mockedEFRepo.Object.AllInternal().Count());
    Assert.IsTrue(results.Count > 0);
} }
公共类donotclaircrepo:eRepository,idonclaircrepo{
私人只读RestUnitOfWork worker;
公共不征求报告(RestUnitOfWork\u工人)
{
工人=_工人;
}
公共IList SelectWithCriteria(DNS\u搜索)
{
//创建where子句
表达式whereClause=c=>(
(String.IsNullOrEmpty(search.FirstName)| | c.FirstName.StartsWith(search.FirstName))&&
(String.IsNullOrEmpty(search.LastName)| | c.LastName.StartsWith(search.LastName))&&
(String.IsNullOrEmpty(search.Address1)| | c.Address1.Contains(search.Address1))&&
(String.IsNullOrEmpty(search.Address2)| | c.Address2.Contains(search.Address2))&&
(String.IsNullOrEmpty(search.City)| | c.City.Contains(search.City))&&
(String.IsNullOrEmpty(search.State)| | c.State.Equals(search.State))&&
(String.IsNullOrEmpty(search.Zip5)| | c.Zip.Equals(search.Zip5))&&
(String.IsNullOrEmpty(search.Phone)| | c.Phone.Equals(search.Phone))&&
(String.IsNullOrEmpty(search.Email)| | c.Email.Equals(search.Email))
);
使用(var范围=工作者)
{
登记范围(本);
var resultList=WhereInternal(where子句).ToList();
Mapper.CreateMap()
.FormMember(dest=>dest.PartnerCode,opt=>opt.Ignore())
.FormMember(dest=>dest.PartnerDescription,opt=>opt.Ignore())
.FormMember(dest=>dest.DonotRequestReason,opt=>opt.Ignore())
.FormMember(dest=>dest.SaveDate,opt=>opt.Ignore())
.ForMember(dest=>dest.InsertDT,opt=>opt.Ignore());
var returnObj=Mapper.Map(结果列表);
return returnObj.FriendlySaveDates();
}
} }
测试

public abstract class EFRepository<T> : IRepository<T> where T : BaseEFModel {

public IUnitOfWork UnitOfWork { get; set; }

private IDbSet<T> _objectset;
private IDbSet<T> ObjectSet
{
    get { return _objectset ?? (_objectset = UnitOfWork.Context.Set<T>()); }
}

public virtual IQueryable<T> WhereInternal(Expression<Func<T, bool>> expression)
{
    return ObjectSet.Where(expression);
} } 
基数:

公共抽象类BaseEFUnitFixture,其中T:BaseEFModel{
受保护的Mock mockedEFRepo=new Mock();
公共模拟(mockedeprepositiority)()
{
var t=新列表();
mockedfrepo.Setup(x=>x.AddInternal(It.IsAny()).Callback((te)=>T.Add(e));
mockedfrepo.Setup(x=>x.AddInternal(It.IsAny()).Callback((IList le)=>t.AddRange(le));
Setup(x=>x.AllInternal()).Returns(t.AsQueryable());
mockedfrepo.Setup(x=>x.WhereInternal(It.Is(y=>y!=null)).Returns(t.AsQueryable());
返回Mockedfrepo;
}
}

实施:

public class DoNotSolicitRepo : EFRepository<DoNotSolicit>, IDoNotSolicitRepo {
private readonly RestUnitOfWork worker;

public DoNotSolicitRepo(RestUnitOfWork _worker)
{
    worker = _worker;
}

public IList<DNSContract> SelectWithCriteria(DNS_Search search)
{
    // create the where clause 
    Expression<Func<DoNotSolicit, bool>> whereClause = c => (
        (String.IsNullOrEmpty(search.FirstName) || c.FirstName.StartsWith(search.FirstName)) &&
        (String.IsNullOrEmpty(search.LastName) || c.LastName.StartsWith(search.LastName)) &&
        (String.IsNullOrEmpty(search.Address1) || c.Address1.Contains(search.Address1)) &&
        (String.IsNullOrEmpty(search.Address2) || c.Address2.Contains(search.Address2)) &&
        (String.IsNullOrEmpty(search.City) || c.City.Contains(search.City)) &&
        (String.IsNullOrEmpty(search.State) || c.State.Equals(search.State)) &&
        (String.IsNullOrEmpty(search.Zip5) || c.Zip.Equals(search.Zip5)) &&
        (String.IsNullOrEmpty(search.Phone) || c.Phone.Equals(search.Phone)) &&
        (String.IsNullOrEmpty(search.Email) || c.Email.Equals(search.Email))
        );

    using (var scope = worker)
    {
        scope.Register(this);
        var resultList = WhereInternal(whereClause).ToList();

        Mapper.CreateMap<DoNotSolicit, DNSContract>()
           .ForMember(dest => dest.PartnerCode, opt => opt.Ignore())
           .ForMember(dest => dest.PartnerDescription, opt => opt.Ignore())
           .ForMember(dest => dest.DoNotSolicitReason, opt => opt.Ignore())
           .ForMember(dest => dest.SaveDate, opt => opt.Ignore())
           .ForMember(dest => dest.InsertDT, opt => opt.Ignore());

         var returnObj = Mapper.Map<IList<DoNotSolicit>, IList<DNSContract>>(resultList);

         return returnObj.FriendlySaveDates();
    }
} }
[TestFixture] public class DNSRepoTest : BaseEFUnitFixture<DoNotSolicit> {
private readonly List<DoNotSolicit> list = new List<DoNotSolicit>();

private class Search
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip5 { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }
}

private Expression<Func<DoNotSolicit, bool>> SearchBuilder(Search search)
{
    //  same as repo logic
    Expression<Func<DoNotSolicit, bool>> whereClause = c => (
       (String.IsNullOrEmpty(search.FirstName) || c.FirstName.StartsWith(search.FirstName)) &&
       (String.IsNullOrEmpty(search.LastName) || c.LastName.StartsWith(search.LastName)) &&
       (String.IsNullOrEmpty(search.Address1) || c.Address1.Contains(search.Address1)) &&
       (String.IsNullOrEmpty(search.Address2) || c.Address2.Contains(search.Address2)) &&
       (String.IsNullOrEmpty(search.City) || c.City.Contains(search.City)) &&
       (String.IsNullOrEmpty(search.State) || c.State.Equals(search.State)) &&
       (String.IsNullOrEmpty(search.Zip5) || c.Zip.Equals(search.Zip5)) &&
       (String.IsNullOrEmpty(search.Phone) || c.Phone.Equals(search.Phone)) &&
       (String.IsNullOrEmpty(search.Email) || c.Email.Equals(search.Email))
       );

    return whereClause;
}

[TestFixtureSetUp]
public void Init()
{
    list.Add(new DoNotSolicit
                 {
                     DoNotSolicitID = 4,
                     FirstName = "nunit",
                     Origination = "testing"
                 });

    mockedEFRepo = MockedEFRepositiory();
    mockedEFRepo.Object.AddInternal(list);
}

[Test]
public void SelectWithCriteria_FirstNameMatch()
{
    var clause = SearchBuilder(new Search{FirstName = "test"});
    var results = mockedEFRepo.Object.WhereInternal(clause).ToList();

    Assert.IsNotNull(results);
    Assert.IsTrue(results.Count < mockedEFRepo.Object.AllInternal().Count());
    Assert.IsTrue(results.Count > 0);
} }
[TestFixture]公共类DNSRepoTest:BaseEFUnitFixture{
私有只读列表=新列表();
私有类搜索
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共字符串地址1{get;set;}
公共字符串地址2{get;set;}
公共字符串City{get;set;}
公共字符串状态{get;set;}
公共字符串Zip5{get;set;}
公用字符串电话{get;set;}
公共字符串电子邮件{get;set;}
}
专用表达式搜索生成器(搜索)
{
//与回购逻辑相同
表达式whereClause=c=>(
(String.IsNullOrEmpty(search.FirstName)| | c.FirstName.StartsWith(search.FirstName))&&
(String.IsNullOrEmpty(search.LastName)| | c.LastName.StartsWith(search.LastName))&&
(String.IsNullOrEmpty(search.Address1)| | c.Address1.Contains(search.Address1))&&
(String.IsNullOrEmpty(search.Address2)| | c.Address2.Contains(search.Address2))&&
(String.IsNullOrEmpty(search.City)| | c.City.Contains(search.City))&&
(String.IsNullOrEmpty(search.State)| | c.State.Equals(search.State))&&
(String.IsNullOrEmpty(search.Zip5)| | c.Zip.Equals(search.Zip5))&&
(String.IsNullOrEmpty(search.Phone)| | c.Phone.Equals(search.Phone))&&
(String.IsNullOrEmpty(search.Email)| | c.Email.Equals(search.Email))
);
返回条款;
}
[TestFixtureSetUp]
公共void Init()
{
列表。添加(新的不请求)
{
DonotID=4,
FirstName=“nunit”,
发起=“测试”
});
mockedEFRepo=mockedefrepositiority();
mockedfrepo.Object.AddInternal(列表);
}
[测试]
public void SelectWithCriteria_FirstNameMatch()
{
var子句=SearchBuilder(新搜索{FirstName=“test”});
var results=mockedfrepo.Object.WhereInternal(子句).ToList();
Assert.IsNotNull(结果);
Assert.IsTrue(results.Count0);
} }

您的方法总体上是错误的。你所做的是模仿你测试的类——这是不正确的。您应该只模拟您正在测试的类外部的东西,因为模拟所做的几乎是用空存根替换模拟对象的功能。如果它是模拟的,则它不工作或与模拟配置一样工作

我看不出您为什么要测试模拟类,因为在本例中,您测试的不是类功能/代码,而是您配置模拟的方式

很难理解你想要什么代码