1

据了解:

Expression<Func<string, bool>> first = x => x.Length == 4;
Expression<Func<string, bool>> second = x => x.Length == 4;

Console.WriteLine(first.Equals(second)); // Output is "False"

但是,检查每个表达式的字符串确实显示相等:

Expression<Func<string, bool>> first = x => x.Length == 4;
Expression<Func<string, bool>> second = x => x.Length == 4;

Console.WriteLine(first.ToString().Equals(second.ToString())); // Output is "True"

这个想法是不同帖子的高潮......

http://www.codethinked.com/Comparing-Simple-Lambda-Expressions-With-Moq Moq'ing 方法,其中 Expression<Func<T, bool>> 作为参数传入 验证方法是使用某些 linq 表达式调用的(moq )

意图:

我正在使用存储库模式编写一个 MVC 应用程序,这样

public class MyController : Controller
{
    public Repository.IRepository Repository { get; set; }

    public MyController()
    {
        this.Repository = new Repository.CommonRepository();
    }

    public MyController(Repository.IRepository repository)
    {
        this.Repository = repository;
    }

    [HttpPost]
    public ActionResult Create(Domain.Common.Object1 o1)
    {
        if (ModelState.IsValid)
        {
            // Additional validation
            o1.Name = o1.Name.Trim();

            if (this.Repository.Any<Domain.Common.Object1>(a => a.Name.ToLower() == plant.Name.ToLower()))
                this.ModelState.AddModelError("Name", "Duplicate found.");
        }

        if (ModelState.IsValid)
        {
            var entity = this.Repository.Add(o1);

            if (Request.IsAjaxRequest())
                return this.Json(new { Completed = true, Id = entity.Id });

            return RedirectToAction("Details", new { id = entity.Id });
        }

        if (Request.IsAjaxRequest())
            return PartialView("_Create", o1);

        return View("Create", o1);
    }
}

存储库与域一样是一个完全独立的项目。我的存储库代码已设置,以便我可以使用一个存储库来查询基于泛型的任何对象:

public IQueryable<T> GetAll<T>() where T : AbstractEntity
{
    return this.DbContext.Set<T>();
}

注意:AbstractEntity 是我的所有 POCO 对象都继承自的域抽象类。

使用 Moq 对控制器进行单元测试时一切正常:

[TestMethod]
public void Create_Post_DuplicateNameAddsError()
{
    // Arrange
    var repository = new Mock<Repository.IRepository>();

    repository.Setup(a => a.Any<Domain.Common.Object1>(It.IsAny<System.Linq.Expressions.Expression<Func<Domain.Common.Object1, bool>>>()))
              .Returns(true);

    var controller = ControllerFactory<MyController>.GetController();
    controller.Repository = repository.Object;

    var model = new Domain.Common.Object1()
    {
        Id = Guid.NewGuid()
        ,
        Name = "Name"
    };



    // Act
    var result = controller.Create(model) as ViewResult;



    // Assert
    Assert.IsFalse(controller.ModelState.IsValid);

    Assert.IsNotNull(result);
    Assert.AreEqual("Create", result.ViewName, false);

    Assert.AreEqual(model, result.Model);
}

注意:ControllerFactory 是一种生成具有某些属性的控制器的方法,例如 Request、Response、User、Request.Headers 等...

如果我必须多次使用 IRepository.Any(predicate) 或使用多次调用的表达式的任何方法,则失败的地方。我需要它对一个人说真,对另一个人说假。如果表达式字符串是匹配的,这将不是问题,但由于所有内容都在不同的项目中,表达式字符串的结果如下:

a => (a.Name.ToLower() == value(foo.Web.Tests.Controllers.Object1ControllerTests+<>c__DisplayClass3).ob1.Name.ToLower())
a => (a.Name.ToLower() == value(foo.Controllers.MyController+<>c__DisplayClass1).ob1.Name.ToLower())

区别在于价值函数。我已经尝试从正则表达式进行匹配,它有效,但很难看,因为你必须转义每个 .<>(),这反过来又使它很难维护。

我尝试使用Matt Meber 的 Expression Equality Comparer,但由于该值函数(我的信念),它们并不相等。

建议?

4

0 回答 0