我試圖在測試中斷言2個Linq表達式。我使用Moq並在回調中捕獲被測方法內部調用的表達式。上述斷言失敗在C#中使用ToString幫助比較lambda表達式
var siteCode = "site1";
var namePattern = "role1";
Expression<Func<Role, bool>> expectedExpression =
t => (string.IsNullOrEmpty(siteCode)
|| t.Name.StartsWith(siteCode + "_")
|| t.Name == siteCode)
&& t.Name.Contains(namePattern);
Assert.AreEqual(expectedExpression.ToString(), actualExpression.ToString());
的:
Expression<Func<Role, bool>> actualExpression = null;
roleRepositoryMock.Setup(t => t.Search(It.IsAny<Expression<Func<Role, bool>>>()))
.Callback((Expression<Func<Role, bool>> exp) =>
{
actualExpression = exp;
})
.Returns(new List<Role> { new Role { Name = "site1_code_role1", Description = "descr" }, new Role { Name = "site1_code" } });
我那麼這個未來的方式進行比較。預期表達爲字符串等於:
t => (((IsNullOrEmpty(value(BL.Tests.RolesServiceTests+<>c__DisplayClass6).siteCode) OrElse t.Name.StartsWith((value(BL.Tests.RolesServiceTests+<>c__DisplayClass6).siteCode + "_"))) OrElse (t.Name == value(BL.Tests.RolesServiceTests+<>c__DisplayClass6).siteCode)) AndAlso t.Name.Contains(value(BL.Tests.RolesServiceTests+<>c__DisplayClass6).namePattern))
而實際表達等於:
t => (((IsNullOrEmpty(value(BL.Services.RolesService+<>c__DisplayClass3).site) OrElse t.Name.StartsWith((value(BL.Services.RolesService+<>c__DisplayClass3).site + "_"))) OrElse (t.Name == value(BL.Services.RolesService+<>c__DisplayClass3).site)) AndAlso t.Name.Contains(value(BL.Services.RolesService+<>c__DisplayClass3).pattern))
的差異是在:
- C_ DisplayClass6和c _DisplayClass3
- BL.Services.RolesService和BL.Tests.RolesServiceTests(命名空間不同)
任何人都可以解釋或向正確的方向發送我爲什麼以及如何解決它? 也許這是一個絕對錯誤的方式來嘗試和通過ToString()比較這些?備擇方案?
這是一個很好的建議。我想我試圖擺脫對象關係的建立(它是否是這種情況下的對象集合)來運行表達式。 – 2013-04-09 07:24:32