У меня проблемы с модульным тестированием метода, который изменяет некоторые свойства ссылочного типа, который ему передается.
В качестве примера, скажем, у меня есть класс с именем Policy.
Policy policy = new Policy();
policy.Status = Active;
Затем я передаю эту политику менеджеру политики для ее деактивации.
policyManager.InactivatePolicy(policy);
Метод политики инактивации выполняет следующие действия:
public void InactivatePolicy(Policy policy)
{
policy.Status = Inactive;
UpdatePolicy(policy); //saves the updated policy details via nhibernate
}
У меня проблемы с модульным тестированием этого метода DoSomething. (игнорируйте тот факт, что то, что он делает в этом примере, бесполезно)
public void DoSomething(Policy policy)
{
Policy policy = new Policy();
policy.Status = Active;
policyManager.InactivatePolicy(policy);
}
Из-за того, что я делаю макет диспетчера политик, статус не становится неактивным
и в результате, когда я утверждаю, что после DoSomething называется статус
политика неактивна Я получил тестовый сбой, так как он все еще активен.
[Test]
public void TheStatusShouldBeInactiveWhenWeDoSomething()
{
Mock<IPolicyManager> policyManagerMock = new Mock<PolicyManager>();
MyClass mc = new MyClass(policyManagerMock.Object);
Policy policy = new Policy();
policy.Status = Active;
mc.DoSomething(policy);
Assert.That(policy.Status, Is.EqualTo(Inactive)); //this fails
}
Так что я нахожусь в ситуации, когда код работает в реальности, но не в изоляции в моих модульных тестах.
Единственный способ обойти эту проблему - заставить метод InactivatePolicy менеджера политики вернуть измененный
политики, чтобы я мог смоделировать ожидаемое возвращаемое значение.
public Policy InactivatePolicy(Policy policy)
{
policy.Status = Inactive;
UpdatePolicy(policy); //saves the updated policy details via nhibernate
return policy;
}
[Test]
public void TheStatusShouldBeInactiveWhenWeDoSomething()
{
Mock<IPolicyManager> policyManagerMock = new Mock<PolicyManager>();
MyClass mc = new MyClass(policyManagerMock.Object);
Policy expectedInactivePolicy = new Policy();
expectedInactivePolicy.Status = Inactive;
Policy policy = new Policy();
policy.Status = Active;
policyManagerMock
.Setup(p => p.InactivatePolicy(policy))
.Returns(expectedInactivePolicy);
mc.DoSomething(policy);
Assert.That(policy.Status, Is.EqualTo(Inactive)); //this now succeeds
}
Обычно, когда я пытаюсь что-то тестировать, это признак того, что я делаю что-то не так.
Кто-нибудь знает, есть ли лучший способ сделать это? Нужно ли по существу возвращать значения, которые изначально предназначались для обновления с помощью ссылочного значения, которое было передано в метод?
Возможно, моя проблема в том, что у менеджера политики не должно быть метода InactivatePolicy, но вместо этого он должен быть в самом объекте Policy, а обновление базы данных вызывается позже?