Вы можете выполнить XPath относительно каждого элемента asset
, чтобы получить vin
и gps
напрямую, без зацикливания:
for asset_xml in root.findall("./assetlist/asset"):
print(asset_xml.attrib['id'])
vin = asset_xml.find("vin")
print(str(vin.text))
gps = asset_xml.find("gps")
print(str(gps.text))
Вы можете создать метод, который оценивает равенство между двумя выражениями:
public class ExpressionMatcher
{
public static Expression<Action<T>> Matches<T>(Expression<Action<T>> action)
{
var methodName = ((MethodCallExpression) action.Body).Method.Name;
return Arg<Expression<Action<T>>>.Matches(a => ((MethodCallExpression)a.Body).Method.Name.Equals(methodName));
}
}
Затем измените оператор-заглушку, чтобы заключить выражение в вызов средства сопоставления выражений:
service.Stub(s => s.GetPropertyOfExistingObject(Arg<int>.Is.Equal(1), ExpressionMatcher.Matches<Quote>(q => q.QuoteNumber))).Return(1234);
Я думаю, проблема связана с тем, как выражения проверяют равенство. Я только что провел быстрый тест в компиляторе фрагментов, и мои выражения никогда не оценивались как одно и то же:
Expression<Func<int, string>> p = i => i.ToString();
Expression<Func<int, string>> s = i => i.ToString();
var b = p.Equals(s) || p == s;
(b было ложным для этого теста)
Вероятно, чтобы ваш тест работал как есть, вам придется игнорировать фактическое значение второго параметра (которое может быть приемлемым или неприемлемым; если неприемлемо, я думаю, вам придется пойти по маршруту WhenCalled).