Недостатки изменения метода на виртуальный, чтобы издеваться над методом - PullRequest
0 голосов
/ 26 июня 2018

У меня есть код, похожий на этот.

[TestMethod]
    public void TestMethod1()
    {
        var mock = new Mock<EmailService>();
        mock.Setup(x => x.SendEmail()).Returns(true);
        var cus = new Customer();
        var result = cus.AddCustomer(mock.Object);
        Assert.IsTrue(result);
    }

public class Customer
{
    public bool AddCustomer(EmailService emailService)
    {
        emailService.SendEmail();
        Debug.WriteLine("new customer added");
        return true;
    }
}

public class EmailService
{            
    public bool SendEmail()
    {
        throw  new Exception("send email failed cuz bla bla bla");
    }
}

Метод EmailService.SendEmail должен быть виртуальным, чтобы смоделировать его, поскольку в этом коде нет интерфейсов.

Чтобы запустить тестовый пример, если я изменил метод на виртуальный, я хочу знать, есть ли какие-либо проблемы или недостатки для этого, когда запускается само приложение?

1 Ответ

0 голосов
/ 26 июня 2018

Нет проблем с этим.Только то, что вы откроете дверь для других кодеров, чтобы изменить поведение вашего класса (обычно вы ваш злейший враг, и вы должны быть отчасти защищены от себя;)

Вы нарушаете рекомендацию =>закрыт для модификации открыт для расширения (SOLID).Также имейте в виду, что если вы должны делать такие вещи, потому что вы зависите от конкретных реализаций, а не от абстракций

public interface IEmailService
{            
    bool SendEmail();
}

 public class EmailService:IEmailService
{            
    public bool SendEmail()
    {
       throw  new Exception("send email failed cuz bla bla bla");
    }
}

public class Customer
{
   public bool AddCustomer(IEmailService emailService)
   {
       emailService.SendEmail();
       Debug.WriteLine("new customer added");
       return true;
   }
}


//unit test => no need to make virtual anything
var mock = new Mock<IEmailService>();
mock.Setup(x => x.SendEmail()).Returns(true);
...