Ну, я думаю, что комментарии всех до сих пор технически правильны - используя что-то вроде RhinoMocks
или Moq
, вы действительно не можете издеваться над статическими методами простым, простым способом.
Но используя Moles
, вы определенно можете. Поэтому, если у вас есть значительный (в настоящее время) непроверенный код, который находится в статических методах, я думаю, вы должны смотреть в Moles.
(Эта ссылка является немного устаревшим, но я до сих пор считаю полезным) http://research.microsoft.com/en-us/projects/pex/molesmanual.pdf
(Key текст)
Родинки могут быть использованы для объезда любой метод .NET, включая невиртуальные и статические методы в герметичных типах.
Как это работает: Предположим, у вас есть типичная ситуация, как это:
public static class SomeStaticClass
{
public static int SomeStaticMethod(string s)
{
return "Static method called: " + s;
}
}
public class SomeInstanceClass
{
public string SomeInstanceMethod(string s)
{
return SomeStaticClass.SomeStaticMethod(s);
}
}
Используя Родинки, ваш тестовый код будет выглядеть следующим образом:
[TestMethod()]
[HostType("Moles")]
public void ShouldBeAbleToTestStaticMethod()
{
var instance = new SomeInstanceClass();
var testValue = instance.SomeInstanceMethod("Some test string");
SomeStaticClass.SomeStaticMethod = (s) => "Moled you! " + s;
Assert.That(testValue, Is.EqualTo("Moled you! Some test string"); // sorry, this has code smell, lol
}
Конечно, вы должны установить вы сможете найти в своем тестовом проекте, поэтому обязательно просмотрите его - множество веб-ресурсов, которые помогут вам на вашем пути.
Некоторые полезные сообщения:
https://msdn.microsoft.com/en-us/library/ff798308.aspx
http://adventuresdotnet.blogspot.com/2011/03/mocking-static-methods-for-unit-testing.html
https://wannabeegeek.wordpress.com/2013/03/13/unit-testing-made-easy-with-moles-part-i/
Вместо жесткого кодирования 'AppData.GetAppData' можно впрыснуть класс, который делает чтение AppData, а затем в вашем модульный тест, высмеивать этот класс и устанавливать требуемое значение возврата. – LInsoDeTeh
С Moq невозможно без дальнейших изменений исходного кода. Но с помощью [Typemock's Isolator] (http://www.typemock.com/isolator-features/test-the-un-testable/fake-static-methods.html) это возможно. Однако Изолятор не свободен. – dee
И [здесь] (http://adventuresdotnet.blogspot.de/2011/03/mocking-static-methods-for-unit-testing.html) дополнительную информацию о насмешливых статических методах. И [здесь] (http://stackoverflow.com/questions/5864076/mocking-static-methods) ответ от SO. HTH – dee