我正在尝试模拟DbContext和DbSet.这适用于我之前的单元测试,但是当我的代码第二次在DbSet上调用ToList方法时出现问题.
首先,dbSet.ToList()返回模拟结果.第二个返回0个元素;
var queryableData = new List<string>{ "a", "b", "c" }.AsQueryable();
var mockDbSet = new Mock<DbSet<string>>();
var q = mockDbSet.As<IQueryable<string>>();
q.Setup(m => m.Provider).Returns(queryableData.Provider);
q.Setup(m => m.Expression).Returns(queryableData.Expression);
q.Setup(m => m.ElementType).Returns(queryableData.ElementType);
q.Setup(m => m.GetEnumerator()).Returns(queryableData.GetEnumerator());
DbSet<string> dbset = mockDbSet.Object;
IQueryable<string> query = dbset;
//RESULTS: abc
var a1 = dbset.ToList();
foreach (var a in a1)
Console.Write(a);
//NO RESULTS
var a2 = dbset.ToList();
foreach (var a in a2)
Console.Write(a);
Run Code Online (Sandbox Code Playgroud) 我有一个每天执行一次的Windows服务.这只是10分钟的行动.
我在网站的bin文件夹中构建服务的文件,因为该服务使用网站dll的.
不幸的是我注意到当我安装网站模块(网站安装程序的dotnetnuke .zip模块)时,我收到一个错误,该文件被antoher进程锁定.
在安装每个模块之前禁用服务是非常有问题的,所以我想让我的服务不能锁定其中使用的dll.
我读到了AppDomain和ShadowCopyFiles选项,但我不能让它们适合我.
这是我如何使用ShadowCopyFiles的示例:
class Program
{
static string GenerateRandomName()
{
//maybe name must be unique?!
var random = new Random();
return "a" + random.Next().ToString() + "b" + random.Next();
}
static int RandomNumber()
{
var info = ConfigureAppDomainSettings();
var domain = AppDomain.CreateDomain(GenerateRandomName(), null, info);
var assembly = domain.Load("SharedLibrary");
var shared = (SharedLibrary.IShared)assembly.CreateInstance("SharedLibrary.Shared");
int retVal = shared.RandomNumber();
AppDomain.Unload(domain);
domain = null;
assembly = null;
shared = null;
info = null;
Console.WriteLine("before cleanning");
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForFullGCComplete();
GC.Collect();
Console.WriteLine("after …Run Code Online (Sandbox Code Playgroud) 我的单元测试失败消息是:
Result Message:
Assert.Equal() Failure
Position: First difference is at position 0
Expected: Double[,] { 0,888888888888889, 1,33333333333333, 1,33333333333333, 2,66666666666667 }
Actual: Double[,] { 0,888888888888889, 1,33333333333333, 1,33333333333333, 2,66666666666667 }
Run Code Online (Sandbox Code Playgroud)
我知道,如果您比较双数,则必须指定精度,因此我的解决方法是:
Assert.Equal(_sA.ToArray(), result.ToArray(), new Comparer());
class Comparer : IEqualityComparer<double[,]>
{
public bool Equals(double[,] x, double[,] y)
{
if (x.GetLength(0) != y.GetLength(0) || x.GetLength(1) != y.GetLength(1))
return false;
for (var i = 0; i < x.GetLength(0); ++i)
{
for(var j = 0; j < x.GetLength(1); ++j)
if (!isEqual(x[i, j], y[i, j]))
return false; …Run Code Online (Sandbox Code Playgroud)