ошибка при выполнении модульного теста на исключение с каркасом Matlab Test - PullRequest
1 голос
/ 30 октября 2019

В папке +WTrade/+Database/@PostgreSQLConnectionOptions есть следующий класс:

classdef PostgreSQLConnectionOptions < handle

  properties (Access = private)
    databaseHost
  end

  methods (Access = public)

    function this = PostgreSQLConnectionOptions()
      this.databaseHost = "";
    end

    function setHostname(this, name)
      if ~isstring(name)
        me = MException("WTrade:invalidParameter", "WTrade.Database.PostgreSQLConnectionOption.setHostname: name must be a string");
        throw(me);
      end
      if 1 ~= length(name)
        me = MException("WTrade:invalidParameter", "WTrade.Database.PostgreSQLConnectionOption.setHostname: name array size must be 1");
        throw(me);
      end

      this.databaseHost = name;
    end

  end
end

Я хочу выполнить модульный тест для этого класса. У меня есть следующий класс теста

classdef PostgreSQLConnectionOptionsTest < matlab.unittest.TestCase

  methods (Test)

    function testWrongHostnameArray(this)
      options = WTrade.Database.PostgreSQLConnectionOptions();
      hostName = ["h1" "h2"];
      this.verifyError(options.setHostname(hostName), 'WTrade:invalidParameter');
    end

  end
end

Когда я пытаюсь запустить тест с помощью следующего сценария:

import matlab.unittest.TestSuite
import matlab.unittest.constraints.Throws;

databaseSuite = TestSuite.fromFolder("tests/WTrade/Database");
result = run(databaseSuite);

Я получаю следующую ошибку:

>> runtests('PostgreSQLConnectionOptionsTest','ProcedureName','testWrongHostnameArray')
Running PostgreSQLConnectionOptionsTest
32        options = WTrade.Database.PostgreSQLConnectionOptions();

================================================================================
Error occurred in PostgreSQLConnectionOptionsTest/testWrongHostnameArray and it did not run to completion.
    ---------
    Error ID:
    ---------
    'MATLAB:TooManyOutputs'
    --------------
    Error Details:
    --------------
    Error using WTrade.Database.PostgreSQLConnectionOptions/setHostname
    Too many output arguments.

    Error in PostgreSQLConnectionOptionsTest/testWrongHostnameArray (line 34)
          this.verifyError(options.setHostname(hostName), 'WTrade:invalidParameter');
================================================================================
.
Done PostgreSQLConnectionOptionsTest
__________

Failure Summary:

     Name                                                    Failed  Incomplete  Reason(s)
    =======================================================================================
     PostgreSQLConnectionOptionsTest/testWrongHostnameArray    X         X       Errored.

ans = 

  TestResult with properties:

          Name: 'PostgreSQLConnectionOptionsTest/testWrongHostnameArray'
        Passed: 0
        Failed: 1
    Incomplete: 1
      Duration: 2.0606
       Details: [1×1 struct]

Totals:
   0 Passed, 1 Failed (rerun), 1 Incomplete.
   2.0606 seconds testing time.

Я не понимаю ошибку 'MATLAB:TooManyOutputs'. Я попробовал метод прямо в Matlab, и он работает, как ожидалось;Я проверяю, является ли аргумент строкой, и если это не так, запускается исключение.

Когда я запускаю следующую команду:

a = WTrade.Database.PostgreSQLConnectionOptions
a.setHostname(["p1", "p2")

Я получаю ожидаемую ошибку.

Error using WTrade.Database.PostgreSQLConnectionOptions/setHostname (line 43)
WTrade.Database.PostgreSQLConnectionOption.setHostname: name array size must be 1

Так почему я не могу правильно отловить исключение в тестовом примере? Как я могу правильно проверить, что я выбрасываю исключение, чтобы я мог пройти тест?

1 Ответ

1 голос
/ 31 октября 2019

Вам нужно передать дескриптор функции для verifyError. То, что происходит сейчас, это то, что вы вызываете this.verifyError(options.setHostname(hostName), 'WTrade:invalidParameter');, который фактически вызывает options.setHostname(hostName) с одним выходным аргументом, который передается в качестве аргумента для verifyError. Вместо этого оно должно быть:

this.verifyError(@() options.setHostname(hostName), 'WTrade:invalidParameter');

Кроме того, я бы рекомендовал использовать стандартное свойство Hostname и вместо написания метода установки использовать синтаксис проверки, например:

classdef PostgreSQLConnectionOptions < handle

  properties 
    Hostname(1,1) string = "";
  end

end

Нет, если вам нужно выполнить больше пользовательских проверок, вы всегда можете написать метод установки следующим образом:

methods
    function set.Hostname(options, hostname)
        % some additional validation here
    end
end

Обратите внимание, что когда вы используете свойства, чтобы использовать verifyError, вы 'Вам нужно будет обернуть его в функцию:

classdef PostgreSQLConnectionOptionsTest < matlab.unittest.TestCase

  methods (Test)

    function testWrongHostnameArray(this)
      options = WTrade.Database.PostgreSQLConnectionOptions();
      hostName = ["h1" "h2"];
      this.verifyError(@setHostname, 'WTrade:invalidParameter');
      function setHostname
          options.Hostname = hostname;
      end
    end

  end
end

Даже если вам нужно обернуть это в функцию для тестирования, в целом лучше использовать свойства такими, какие они есть. У нас есть встроенная инкапсуляция с помощью Matlab , и я думаю, что лучше использовать ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...