Замените Returns (b) на Returns (() => b) вместо этого, чтобы сделать 'b' захваченной переменной, а не просто переменной, передаваемой по значению методу.
ю, что мы можем позвонитьSetupAllProperties()
автоматически создавать резервные свойства. Но это слишком ограничительно, потому что не позволяет мне выполнять дополнительный код в getter / setters. Например, я хотел бы создать установщик moq'd, который вызывает некоторый другой метод / событие / логику.
Следующий пример кода воспроизводит проблему
public interface IA
{
int B { get; set; }
};
class Test
{
[Test]
public void BackingPropertyTest()
{
int b = 1;
var mockA = new Mock<IA>();
//mockA.SetupAllProperties();
mockA.SetupGet(m => m.B).Returns(b);
mockA.SetupSet(m => m.B).Callback(val => b = val);
mockA.Object.B = 2;
Assert.AreEqual(2, b); // pass. b==2
Assert.AreEqual(2, mockA.Object.B); // fail. mockA.Object.B==1, instead of 2
}
}
Так как геттер настроен так, чтобы возвращать значение локальной переменной (которая, я думаю, теперь является захваченной переменной), я ожидал увидетьmockA.Object.B == 2
, Но вместо этого это1
.
Я что-то здесь упускаю? Или это ошибка MOQ? Я использую MOQ 4.0.10501.6