Чего вам не хватает, так это Async async = context.async();
. При этом юнит-тест остается в методе до тех пор, пока он не будет установлен для завершения. Затем вы можете организовать свой асинхронный код следующим образом:
Я также сделал некоторую очистку, проверьте ее:
BeforeClass
@BeforeClass
public static void before2(TestContext context){
Async async = context.async();
vertx = Vertx.vertx();
DeploymentOptions options = new DeploymentOptions();
byte[] encoded;
JsonObject config;
try {
encoded = Files.readAllBytes(Paths.get("src/main/resources/config.json"));
config = new JsonObject(new String(encoded, Charset.defaultCharset()));
options.setConfig(config);
jdbc = JDBCClient.createShared(vertx, config , "PostgreSQL");
deployVerticle2(options)
.compose(c -> loadTestData2(jdbc))
.setHandler(h -> {
if(h.succeeded()){
async.complete();
}else{
context.fail(h.cause());
}
});
} catch (IOException e){
context.fail(e);
}
}
DeployVerticle
[ 111]LoadTestData
private static Future<Void> loadTestData2(JDBCClient jdbc){
Future<Void> future = Future.future();
jdbc.getConnection(connection -> {
if (connection.succeeded()) {
connection.result().query(deleteTestDataGeneration, queryResult -> {
if(queryResult.failed()){
connection.result().close();
future.fail(queryResult.cause());
}else{
connection.result().close();
future.complete();
}
});
} else {
future.fail(connection.cause());
}
});
return future;
}
Таким образом, маршрут, что я направился вниз, прежде чем оказались плохая идея, просто нет достаточного доступа в платформе для достигания битов, в которых Вы нуждаетесь. По крайней мере, не изобретая велосипед несколько раз.
Я решил возглавить вниз маршрут расширения класса ModelState для добавления набора предупреждений к нему:
public class AetherModelState : ModelState
{
public AetherModelState() { }
public AetherModelState(ModelState state)
{
this.AttemptedValue = state.AttemptedValue;
foreach (var error in state.Errors)
this.Errors.Add(error);
}
private ModelErrorCollection _warnings = new ModelErrorCollection();
public ModelErrorCollection Warnings { get { return this._warnings; } }
}
Чтобы смочь легко добавить предупреждения таким же образом, что Вы были бы ошибки, я создал некоторые дополнительные методы для ModelStateDictionary:
public static class ModelStateDictionaryExtensions
{
public static void AddModelWarning(this ModelStateDictionary msd, string key, Exception exception)
{
GetModelStateForKey(key, msd).Warnings.Add(exception);
}
public static void AddModelWarning(this ModelStateDictionary msd, string key, string errorMessage)
{
GetModelStateForKey(key, msd).Warnings.Add(errorMessage);
}
private static AetherModelState GetModelStateForKey(string key, ModelStateDictionary msd)
{
ModelState state;
if (string.IsNullOrEmpty(key))
throw new ArgumentException("key");
if (!msd.TryGetValue(key, out state))
{
msd[key] = state = new AetherModelState();
}
if (!(state is AetherModelState))
{
msd.Remove(key);
msd[key] = state = new AetherModelState(state);
}
return state as AetherModelState;
}
public static bool HasWarnings(this ModelStateDictionary msd)
{
return msd.Values.Any<ModelState>(delegate(ModelState modelState)
{
var aState = modelState as AetherModelState;
if (aState == null) return true;
return (aState.Warnings.Count == 0);
});
}
}
Код GetModelStateForKey скверен, но необходимо смочь видеть, куда я направляюсь с этим. Следующая вещь сделать состоит в том, чтобы записать некоторые дополнительные методы, которые позволяют мне отображать предупреждения наряду с ошибками
Почему не просто добавляют список предупреждений или словарь, к ViewData и затем отображают их в Вашем представлении?
например.
ViewData[ "warnings" ] = new[] { "You need to snarfle your aardvark" } ;