我正在使用 EF Core 3.1 为 SqlServer 构建我的数据库模型。我还使用 EF 生成的迁移文件来处理数据库更改。为了进行测试,我正在按照微软文档中的描述启动内存中的 Sqlite 关系数据库:https : //docs.microsoft.com/en-us/ef/core/miscellaneous/testing/sqlite。
我所有的测试都按预期运行,直到我将视图添加到我的数据库中。根据此文档添加了视图:https : //docs.microsoft.com/en-us/ef/core/modeling/keyless-entity-types。
根据 Microsoft 文档,测试示例应如下所示:
[Fact]
public void Add_writes_to_database()
{
// In-memory database only exists while the connection is open
var connection = new SqliteConnection("DataSource=:memory:");
connection.Open();
try
{
var options = new DbContextOptionsBuilder<BloggingContext>()
.UseSqlite(connection)
.Options;
// Create the schema in the database
using (var context = new BloggingContext(options))
{
context.Database.EnsureCreated();
}
// Run the test against one instance of the context
using …Run Code Online (Sandbox Code Playgroud) 根据selenium,隐式等待轮询DOM一段时间以查看元素是否显示.我的理解是它将轮询到指定的时间量,但如果之前显示了一个元素,那么它将继续而无需进一步等待.
http://seleniumhq.org/docs/04_webdriver_advanced.html
我有一个在大约13秒内运行的方法.当我将隐式等待设置为100秒时,需要213秒.
driver.manage().timeouts().implicitlyWait(100, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)
看来在这种方法中,我等了2次(每次100秒).将隐式等待设置为0或100不会影响我的方法.在这两种情况下,他们都正确完成.
我的问题是这个.我认为隐式等待等待元素显示的最短时间.这是正确的吗?或者我做错了什么?
此外,为什么它等待2次,显然不需要等待?(即使我将等待设置为0,我的方法也能正确完成)
我是plpgsql的新手.我正在尝试使用plpgsql中的变量作为表名在plpgsql中运行一个简单的查询.但是变量被解释为表名而不是被解释为变量名的变量的值.
DECLARE
v_table text;
z_table text;
max_id bigint;
BEGIN
FOR v_table IN
SELECT table_name
FROM information_schema.tables
WHERE table_catalog = 'my_database'
AND table_schema = 'public'
AND table_name not like 'z_%'
LOOP
z_table := 'z_' || v_table;
SELECT max(id) from z_table INTO max_id;
DELETE FROM v_table where id > max_id;
END LOOP;
Run Code Online (Sandbox Code Playgroud)
一些背景资料.对于我的数据库中的每个表,我有另一个以"z_"开头的表.例如,对于一个名为"employee"的表,我有一个名为"z_employee"的相同表.z_employee包含与员工相同的数据集.我在每次测试开始时使用它来恢复employee表.
当我运行此函数时,我收到以下错误:
ERROR: relation "z_table" does not exist
LINE 1: SELECT max(id) from z_table
Run Code Online (Sandbox Code Playgroud)
我的猜测是我不允许z_table在SQL查询中使用该变量.至少不是我在这里使用它的方式.但我不知道它应该如何完成.
我有一个像这样的方法:
public Something MyMethod()
{
Setup();
Do something useful...
TearDown();
return something;
}
Run Code Online (Sandbox Code Playgroud)
Setup和TearDown方法位于基类中.
我遇到的问题是我必须使用Setup()和TearDown()方法调用一遍又一遍地编写这种类型的方法.
编辑:这个方法的棘手部分是"做一些有用的东西......"仅适用于此方法.这个部分对我创建的每个方法都不同.
另外,我可以将MyMethod2,MyMethod3放在一个类中.在所有情况下,我想运行设置和拆解
有没有一种优雅的方式来做到这一点,而不必每次都写这个?
也许我是妄想,但是这是一种向方法添加属性并拦截方法调用的方法,所以我可以在调用之前和之后做一些事情?
我有一个像这样的Json对象:
{"company": "My Company",
"companyStart" : "2015/01/01",
"employee" :
{ "name" : "john doe",
"startDate" : 1420434000000 } }
Run Code Online (Sandbox Code Playgroud)
我的json对象是这样的:
public class Company {
public string company;
public DateTime companyStart;
public Employee employee;
}
public class Employee {
public string name;
public DateTime startDate;
}
Run Code Online (Sandbox Code Playgroud)
我原来的代码像这样反序列化
JsonConvert.DeserializeObject<Company>(jsonString);
Run Code Online (Sandbox Code Playgroud)
此代码可以毫无问题地转换Company.companyStart,但是当它到达Employee.startDate时,它不知道如何处理Long.
这篇文章向我展示了如何创建自定义JsonConverter以将long转换为DateTime,但正如您在我的案例中所看到的,这会让我无法将Company.companyStart转换为DateTime.
所以......我在考虑做这样的事情:
public class Company : JsonBase {
...
}
public class Employee : JsonBase {
...
Employee() { Converter = new CustomDateConverter(); }
}
public class JsonBase {
private JsonConverter …Run Code Online (Sandbox Code Playgroud) 我正在尝试将数据库引擎从MsSql迁移到PostgreSQL。在我们的自动化测试中,我们在每次测试开始时将数据库恢复到“干净”状态。我们通过比较数据库的工作副本和干净副本(逐表)之间的“差异”来做到这一点。然后复制所有已更改的记录。或删除任何已添加的记录。到目前为止,这种策略似乎是我们最好的方法,因为每次测试不会更改很多数据,并且数据库的大小也不是很大。
现在,我正在寻找一种基本上可以使用PostgreSQL进行相同操作的方法。我正在考虑对PostgreSQL做完全相同的事情。但是在这样做之前,我想知道是否还有其他人做过类似的事情,以及您使用哪种方法在自动化测试中恢复数据。
附带说明-我考虑过使用MsSql的快照或备份/还原策略。这些方法的主要问题是,每次测试后,我都必须从应用程序重新建立数据库连接,目前无法实现。
c# ×3
postgresql ×2
dom ×1
dynamic-sql ×1
ef-core-3.1 ×1
json ×1
json.net ×1
plpgsql ×1
testing ×1