Как смоделировать объект класса, который создается внутри метода, используя новое ключевое слово в MOQ - PullRequest
0 голосов
/ 11 января 2019

Я использую Moq для написания кейсов.

Код:

public class SavingAccount  
{  
    public void Data()  
    {  
        //Some logic
    }  
}  

public class Account  
{  
    public void GetAccountDetails()  
    {  
        SavingAccount savingAccount = new SavingAccount();  
        savingAccount.Data();  

        //Some logic
    }  
}

Контрольный пример:

[TestClass]
public class AccountTest
{
    [TestMethod]
    public void TestGetAccountDetails()
    {
       using(var mock = new AutoMock.GetLoose())
       {
          var mockAccount = mock.Create<Account>();
          mockAccount.GetAccountDetails();
       }
    }
}

Здесь мне нужно высмеять метод savingAccount.Data(); класса SavingAccount. Но когда я запускаю приведенный выше тест, объект savingAccount фактически вызывает метод Data(). Я не хочу это называть, просто хочу издеваться.

Также я не изменяю вышеуказанный код. Я не хочу использовать интерфейс.

1 Ответ

0 голосов
/ 11 января 2019

Я могу придумать два пути:

Метод 1. Создайте фабрику и передайте ее Account, когда вы ее создадите. Если вам нужен SavingAccount, позвоните на фабрику:

    public class Account
    {
        private readonly IAccountFactory _accountFactory;

        public Account(IAccountFactory accountFactory)
        {
            _accountFactory = accountFactory;
        }

        public void GetAccountDetails()  
        {  
            SavingAccount savingAccount = _accountFactory.CreateSavingAccount();
            savingAccount.Data();  

            //Some logic
        }   
    }

Затем вы можете передать имитированную реализацию IAccountFactory в Account. Я рекомендую это сделать, и в будущем вам будет проще перейти к внедрению зависимостей, если вы когда-нибудь решите это сделать.

Метод 2. Перемещение экземпляра SavingAccount в макетный метод:

    public class Account  
    {  
        public void GetAccountDetails()  
        {  
            SavingAccount savingAccount = CreateSavingAccount();
            savingAccount.Data();  

            //Some logic
        }

        protected virtual SavingAccount CreateSavingAccount()
        {
            return new SavingAccount();
        }
    }

Теперь вы можете смоделировать CreateSavingAccount и заставить его вернуть имитированный экземпляр SavingAccount. Обратите внимание, что вам также нужно изменить public void Data() на public virtual void Data(), чтобы вы могли его высмеять.

...