テストで 2 つの Linq 式をアサートしようとしています。私は Moq を使用しており、テスト中のメソッド内で呼び出された式をコールバックでキャプチャします。
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" } });
次に、これを次の方法で比較します。
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());
上記の Assert は失敗します。文字列に期待される式は次のとおりです:
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() を介してこれらを比較しようとするのは、まったく間違った方法でしょうか? 代替案?