Здравствуйте, _NN_, Вы писали:
_NN>Как сегодня правильно тестировать код, который не должен компилироваться ?
О каких тестах идет речь? Все тесты, о который я знаю (unit tests, integration tests, ui test, и т.д.) прогоняются после компиляции.
_NN>В принципе несложно вручную запустить компилятор и разбирать выхлоп, но может есть что-то готовое ?
Предположу, что вы динамически комплируете что-то. Знаете о CodeDOM? Если что-то простое, в виде одного файла, то можно попытаться скомпилировать и посмотреть ошибки CompilerError:
var options = new CompilerParameters();
string source = "using System;static class Blablabla{...";
var compile = provider.CompileAssemblyFromSource(options, source);
if (compile.Errors.HasErrors)
foreach (CompilerError error in compile.Errors)
{
...
}
Здравствуйте, BlackEric, Вы писали:
BE>Здравствуйте, _NN_, Вы писали:
_NN>>Как сегодня правильно тестировать код, который не должен компилироваться ?
BE>А можно подробнее? Что там тестировать если оно не собирается? И зачем вам не собирающийся код?
Например хочу запретить писать using(lock.LockAsync()), и требовать только using(await lock.LockAsync())
Или там запрет на передачу ссылочных типов , и хочу гарантировать , что в будущем никто не поменяет.
Здравствуйте, Sinatr, Вы писали:
S>Здравствуйте, _NN_, Вы писали:
_NN>>Как сегодня правильно тестировать код, который не должен компилироваться ?
S>О каких тестах идет речь? Все тесты, о который я знаю (unit tests, integration tests, ui test, и т.д.) прогоняются после компиляции.
А как же тестируется компилятор на ошибочный код?
Я знаю как это можно решить.
Вопрос в том если есть что-нибудь готовое, чтобы не писать с нуля.
Здравствуйте, _NN_, Вы писали:
_NN>Например хочу запретить писать using(lock.LockAsync()), и требовать только using(await lock.LockAsync()) _NN>Или там запрет на передачу ссылочных типов , и хочу гарантировать , что в будущем никто не поменяет.
StyleCop следит за соблюдением заданных стилистических правил в коде. Несоответствия отображаются в редакторе Visual Studio и в виде сообщений на этапе компиляции. Можно использовать как готовый набор правил, так и создать свой, в котором для каждого правила определить тип сообщения (ошибка, предупреждение и т.д.).
_NN>Например хочу запретить писать using(lock.LockAsync()), и требовать только using(await lock.LockAsync()) _NN>Или там запрет на передачу ссылочных типов , и хочу гарантировать , что в будущем никто не поменяет.
FxCop/Stylecop не? Только правила придется самому писать.
Resharper/Rider c custom code inspections. Не знаю только, умеют ли они в неинтерактивном режиме. Да и платные они. Анализаторы кода. Не знаю, в каком это сейчас состоянии и живое ли вообще.
Здравствуйте, _NN_, Вы писали:
_NN>Как сегодня правильно тестировать код, который не должен компилироваться ?
_NN>В принципе несложно вручную запустить компилятор и разбирать выхлоп, но может есть что-то готовое ?
Здравствуйте, _NN_, Вы писали:
_NN>Например хочу запретить писать using(lock.LockAsync()), и требовать только using(await lock.LockAsync())
Вместо проверки некомпилируемости конструкции можно сделать по проллетарски
Assert.IsFalse(lock.LockAsync() is IDisposable);
Сойдет?
_NN>Или там запрет на передачу ссылочных типов , и хочу гарантировать , что в будущем никто не поменяет.
var constraints = typeof(ThatClass<>).GetGenericArguments()[0].GetGenericParameterConstraints();
Assert.IsOk(...);
Т.е. рефлексией распортрошить тип и проверить, разрешаются ли там ссылочные тип.
mb () : void {
def _ = m3.f_private; // E: is not accessibledef _ = m3.f_protected; // E: is not accessibledef _ = m3.f_public; // OK
m3.m_public (); // OK
m3.m_private (); // E: is not accessible
m3.m_protected (); // E: is not accessible
M.M4.foo (); // FIXME: cannot access `M.M4'def _ = list (); // E: type `Nemerle.Core.list.*' is abstract and cannot be constructeddef _ = foo (); // E: type `foo' is abstract and cannot be constructeddef _ = foo.A (); // OK
()
}
Здравствуйте, _NN_, Вы писали:
_NN>Например хочу запретить писать using(lock.LockAsync()), и требовать только using(await lock.LockAsync()) _NN>Или там запрет на передачу ссылочных типов , и хочу гарантировать , что в будущем никто не поменяет.
Это называется статический анализ. Гугли про static analyser. Встроенное решение — FxCop. Самое продвинутое, наверное, ReSharper CommandLine Tools.
Здравствуйте, RushDevion, Вы писали:
RD>Resharper/Rider c custom code inspections. Не знаю только, умеют ли они в неинтерактивном режиме. Да и платные они.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, _NN_, Вы писали:
_NN>>Например хочу запретить писать using(lock.LockAsync()), и требовать только using(await lock.LockAsync()) _NN>>Или там запрет на передачу ссылочных типов , и хочу гарантировать , что в будущем никто не поменяет.
НС>Это называется статический анализ. Гугли про static analyser. Встроенное решение — FxCop. Самое продвинутое, наверное, ReSharper CommandLine Tools.
Почти , только я хотел бы , чтобы было легко описывать желаемое поведение .
См. пример http://rsdn.org/forum/dotnet/7378972.1