테스트에서 2 개의 Linq 표현식을 사용하려고합니다. Moq를 사용하고 콜백에서 테스트중인 메소드 내부에서 호출 된 표현식을 캡처합니다. 어설 실패 위에C#에서 람다 식과 ToString을 사용하여 비교하기
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()을 통해 이들을 비교하고 비교하는 것이 절대적으로 잘못된 방법 일 수 있습니까? 대안?
좋은 제안입니다. 나는 내가 표현을 실행하기 위해 객체 관계의 설정 (이 경우 객체 컬렉션이 될 것인가)을 벗어나려고했다. –