单元测试
ZKWeb使用了独自编写的测试框架,编写时参考了XUnit。
测试可以在控制台中运行,也可以使用默认的插件集在网页上运行。
创建测试
测试类需要标记Tests
属性,标记后该类下面的所有公开函数都会成为测试函数。
添加src\Tests\ExampleTest.cs
,内容如下
使用Assert
可以测试条件是否成立,如果测试失败会抛出AssertException
。
[Tests]
class ExampleTest {
public void MethodA() {
Assert.IsTrue(1 == 1);
Assert.IsTrueWith(1 == 1, "if failed this item will be outputed");
Assert.Equals(true, true);
Assert.Throws<ArgumentException>(() => { throw new ArgumentException(); });
}
}
运行测试
在控制台中运行
设置主项目到您的项目名.Console
并运行。
在网页上运行
参考UnitTest.WebTester
插件的文档。
在测试中重载Http上下文
在测试时,有时需要重载Http上下文,
可以使用HttpManager.OverrideContext
函数重载当前的上下文。
在ExampleTest
类中添加以下函数
public void MethodB() {
using (HttpManager.OverrideContext("/?a=1", "POST")) {
var request = (HttpRequestMock)HttpManager.CurrentContext.Request;
request.remoteIpAddress = IPAddress.Parse("192.168.168.168");
Assert.Equals(request.Get<string>("a"), "1");
Assert.Equals(request.RemoteIpAddress, IPAddress.Parse("192.168.168.168"));
}
}
在测试中模拟IoC容器
在测试时,有时需要影响容器返回的组件,
可以使用Application.OverrideContainer
重载当前的IoC容器。
在ExampleTest
类中添加以下函数
public void MethodC() {
using (Application.OverrideIoc()) {
Application.Ioc.Unregister<IEntityOperationHandler<ExampleTable>>();
Assert.IsTrue(!Application.Ioc.ResolveMany<IEntityOperationHandler<ExampleTable>>().Any());
}
// override is finished
Assert.IsTrue(Application.Ioc.ResolveMany<IEntityOperationHandler<ExampleTable>>().Any());
}
在测试中使用临时数据库
在测试时,有时需要做涉及到数据库的测试,
可以使用TestManager.UseTemporaryDatabase
来让指定范围内的代码使用临时数据库。
临时数据库默认使用内存数据库,也可以通过修改网站配置使用指定的数据库。
在ExampleTest
类中添加以下函数
public void MethodD() {
var testManager = Application.Ioc.Resolve<TestManager>();
using (testManager.UseTemporaryDatabase()) {
var databaseManager = Application.Ioc.Resolve<DatabaseManager>();
using (var context = databaseManager.CreateContext()) {
var obj = new ExampleTable() { Name = "obj in temporary database" };
context.Save(ref obj);
}
}
}