Не так давно
Mike Chaliy опублікував пост про
перевірку параметрів за допомогою Rhino.Mocks. Так як мені довелось трохи попрацювати з TypeMock.NET, то я поцікавився у автора чи не знає він як реалізувати подібну штуку там. Нажаль Mike Chaliy дав негативну відповідь :( тому прийшлось розбиратись самотужки.
В результаті виявилось, що у TypeMock.NET це реалізовується набагато простіше:
public class SomeClass
{
public int TestMethod(int x, string y)
{
throw new NotImplementedException("TestMethod(int, string) is not implemented");
}
}
[TestFixture]
[ClearMocks]
public class Tests
{
[Test]
[VerifyMocks]
public void FirstTest()
{
SomeClass s = new SomeClass();
using (RecordExpectations recorder = RecorderManager.StartRecording())
{
recorder.ExpectAndReturn(s.TestMethod(1, "2"), 10).RepeatAlways();
recorder.CheckArguments(Check.Not(-1, "'x'-parameter can't be less than 'zero'"), Check.NotNull("'y'-parameter can't be null"));
}
Assert.AreEqual(10, s.TestMethod(1, "2"));
Assert.AreEqual(10, s.TestMethod(-1, null));
}
}Все ніби і класно, але щось підказує, що має бути "ложка дьогтю"... і імя цій ложці - "ліцензія"! :( Іншими словами, код приведений вище буде працювати тільки після покупки
Professional або
Enterprise ліцензії. А "бідним" студентам прийдеться користуватись "стандартним" набором можливостей:
[TestFixture]
public class Tests
{
[Test]
public void SecondTest()
{
Mock sc = MockManager.MockAll(typeof(SomeClass));
sc.AlwaysReturn("TestMethod", 10).Args(Check.Not(-1,
"'x'-parameter can't be less than 'zero'"),
Check.NotNull("'y'-parameter can't be null"));
SomeClass s = new SomeClass();
Assert.AreEqual(10, s.TestMethod(1, "2"));
Assert.AreEqual(10, s.TestMethod(-1, null));
}
}>> UPDATEТут мене справедливо "ткнули носом" в той факт, що я пропустив важливе слово "Callback" в кінці теми минулого поста від
Mike Chaliy. Зараз я постараюсь виправитись і для повноти картини додам ще один код тесту:
[Test]
public void ThirdTest()
{
Mock sc = MockManager.MockAll(typeof(SomeClass));
SomeClass s = new SomeClass();
sc.AlwaysReturn("TestMethod", 10).Args(
new ParameterCheckerEx(delegate (ParameterCheckerEventArgs e)
{
if(((int)e.ArgumentValue) < 0)
{
e.FailureMessage = "First param can't be less then zero";
return false;
}
return true;
}),
new ParameterCheckerEx(delegate (ParameterCheckerEventArgs e)
{
if (e.ArgumentValue == null)
{
e.FailureMessage = "Second param can't be null";
return false;
}
return true;
}));
Assert.AreEqual(10, s.TestMethod(1, "2"));
Assert.AreEqual(10, s.TestMethod(-1, null));
}От тепер справді можна порівнювати
:)