How to use Matlab's unit test framework component verifyError to verify an error from a MEX function
Mostrar comentarios más antiguos
Let's say I've written a MEX function, foo, that when given the number 5 throws an error.
Inside the mex function, the code would look something like:
if (inputValue == 5)
{
char errMsg[250];
sprintf_s(errMsg, "ERROR: input was %d, and so I'll throw an error", inputValue);
mexErrMsgTxt(errMsg);
}
Now, if I call foo(5), this error will be thrown.
I cannot seem to figure out how to write a unit test to verify this!
function Verify_Foo_Throws_Error(testCase)
err_msg = 'ERROR';
testCase.verifyError(@()foo(5), err_msg);
end % Verify_Foo_Throws_Error()
I cannot seem to substitute anything in for the 'err_msg' variable in my example to get the test to pass!
Interestingly enough, when err_msg has some string, the test throws the feedback:
Actual Identifier:
''
Expected Identifier:
ERROR (<- whatever the value of the variable 'err_msg' is from my example)
Yet when I make err_msg an empty string, the test fails as incomplete with the messages:
================================================================================
Uncaught error occurred in Foo_Test/Verify_Foo_Throws_Error.
The remainder of the test method will not run to completion.
--------------
Error Details:
--------------
Error using matlab.unittest.constraints.Throws (line 161)
Expected exception to be a row vector.
Error in matlab.unittest.internal.qualifications.QualificationDelegate/qualifyError (line 152)
throws = delegate.decorateConstraintAlias(Throws(errorClassOrID),'Error');
Error in matlab.unittest.qualifications.Verifiable/verifyError (line 687)
qualifyError(verifiable.VerificationDelegate, ...
Error in Foo_Test/Verify_Foo_Throws_Error (line 138)
testCase.verifyError(@()foo(5), err_msg);
================================================================================
Any assistance would be most appreciated. Thanks!
Respuesta aceptada
Más respuestas (1)
BdS
el 2 de Nov. de 2018
Editada: Walter Roberson
el 9 de Nov. de 2018
Hi Andy,
perhaps you can help me.
how to only test the error message? I would like to test the following message written in this function:
function [CorrectFields]=FieldValidity(fieldNames,FieldDescrip)
check=FieldDescrip;
[badFld,indBadFld]=ismember('BAD_FLD',check(:,2));
if badFld
error('Bad field identifier entered: %s not found.',fieldNames{indBadFld})
else
CorrectFields=fieldNames;
end
end
Thank you in advance for your help.
3 comentarios
Philip Borghesani
el 2 de Nov. de 2018
It is best to ask a new question when you have one. However in this case the same answer applies. verifyError requires an error id so add one to the error arguments call error:
error('FieldValidity:BadIdentifier','Bad field identifier entered: %s not found.',fieldNames{indBadFld})
Then test for FieldValidity:BadIdentifier. verify error is written this way to allow the message to be translated to other languages and to avoid difficult string comparisons when the message changes like this one does.
Paul Wintz
el 3 de Oct. de 2021
In R2021a (possibly earlier) you can pass an empty string for the error ID to verifyError of errors that do not have an error ID.
If you want to verify an error that doesn't have an error identifier or where you care that an error was thrown regardless of its identifier (or even if it has an identifier) you can use a metaclass object. For the class that represents an error (like the object you would get if you wrote a try / catch to store the caught exception in a variable) the metaclass object you want to use in the verifyError call is ?MException.
try
y = ones(2) + ones(3);
catch ME
classOfME = class(ME)
idFromCaughtError = ME.identifier
end
testcase = matlab.unittest.TestCase.forInteractiveUse;
verifyError(testcase, @() ones(2)+ones(3), 'MATLAB:sizeDimensionsMustMatch', ...
'Verify that a specific error was thrown')
verifyError(testcase, @() ones(2)+ones(3), ?MException, ...
'Verify that an error was thrown, regardless of which one')
Categorías
Más información sobre Multi-Object Trackers en Centro de ayuda y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!