Django(1.2 beta)将在每个运行的测试之间重置数据库,这意味着每个测试都在空DB上运行.但是,数据库不会刷新.刷新数据库的一个影响auto_increment
是重置计数器.
考虑通过主键从数据库中提取数据的测试:
class ChangeLogTest(django.test.TestCase):
def test_one(self):
do_something_which_creates_two_log_entries()
log = LogEntry.objects.get(id=1)
assert_log_entry_correct(log)
log = LogEntry.objects.get(id=2)
assert_log_entry_correct(log)
Run Code Online (Sandbox Code Playgroud)
这将通过,因为只创建了两个日志条目.但是,如果添加了另一个测试ChangeLogTest
并且它恰好在之前 运行test_one
,则日志条目的主键不再是1和2,它们可能是2和3.现在test_one
失败.
这实际上是一个两部分问题:
./manage.py test
在每个测试用例之间刷新数据库?我有一个C#接口,其中某些方法参数声明为object
类型.但是,传递的实际类型可能因实现接口的类而异:
public interface IMyInterface
{
void MyMethod(object arg);
}
public class MyClass1 : IMyInterface
{
public void MyMethod(object arg)
{
MyObject obj = (MyObject) arg;
// do something with obj...
}
}
public class MyClass2 : IMyInterface
{
public void MyMethod(object arg)
{
byte[] obj = (byte[]) arg;
// do something with obj...
}
}
Run Code Online (Sandbox Code Playgroud)
MyClass2的问题在于转换byte[]
和转换object
是装箱和拆箱,这是影响性能的计算上昂贵的操作.
用通用接口解决这个问题会避免装箱/拆箱吗?
public interface IMyInterface<T>
{
void MyMethod(T arg);
}
public class MyClass1 : IMyInterface<MyObject> …
Run Code Online (Sandbox Code Playgroud) 在查看C#代码时,我经常会看到这样的模式:
DataType[] items = GetSomeItems();
OtherDataType[] itemProps = new OtherDataType[items.Length];
int i = 0;
foreach (DataType item in items)
{
// Do some stuff with item, then finally
itemProps[i] = item.Prop;
i++;
}
Run Code Online (Sandbox Code Playgroud)
for循环遍历对象items
,但也保持counter(i
)以进行迭代itemProps
.我个人不喜欢这种额外的i
闲逛,而是可能做的事情如下:
DataType[] items = GetSomeItems();
OtherDataType[] itemProps = new OtherDataType[items.Length];
for (int i = 0; i < items.Length; i++)
{
// Do some stuff with items[i], then finally
itemProps[i] = items[i].Prop;
}
Run Code Online (Sandbox Code Playgroud)
对于我不知道的第一种方法,是否有一些好处?这是每个人都试图使用这种花哨foreach (...)
语法的结果吗?我对你的意见感兴趣.