I would like to test if execution invokes a method with string that contains given part AND an instantiation of class that contains (on it's constructor) part of given string.
[TestMethod]
public void TestMethod1()
{
// Arrange
var fakeLogger = A.Fake<ILogger>();
var loggerExecutor = new LoggerExecutor(fakeLogger);
// Act
loggerExecutor.Log();
// Assert
A.CallTo(() => fakeLogger.Error(A<string>.That.Contains("string")).MustHaveHappenedOnceExactly();
A.CallTo(() => fakeLogger.Error(
A.Fake<LogLine>(x => x.WithArgumentsForConstructor(() => A<string>.That.Contains("LogLine"))))
).MustHaveHappenedOnceExactly();
}
public class LoggerExecutor
{
private readonly ILogger _logger;
public LoggerExecutor(ILogger logger)
{
_logger = logger;
}
public void Log()
{
_logger.Error("With string parameter");
_logger.Error(new LogLine("With LogLine parameter"));
}
}
The first assert with string object works. But, when I'm trying to test the second assert, it fails with the following exception:
System.InvalidOperationException: An argument constraint, such as That, Ignored, or _, cannot be nested in an argument.
at FakeItEasy.Expressions.ExpressionArgumentConstraintFactory.ArgumentConstraintExpressionVisitor.VisitMember(MemberExpression node)
I should try with fake object to avoid repeat all string on tests.
LogLine class:
public class LogLine
{
public readonly string Message;
public readonly object[] Params;
public static implicit operator LogLine(string message)
{
return new LogLine(message ?? string.Empty);
}
public LogLine(string message, params object[] @params)
{
Message = message;
Params = @params;
}
}
Tested with:
- FakeItEasy v6.0.1
- MSTest.TestAdapter v2.1.1
- MSTest.TestFramework v2.1.1