我想测试一个使用Linq to SQL的类。 我用TypeMock Isolator伪造了datacontext,但是datacontext也有一个我不知道如何伪造的函数。 此函数用于Linq to Sql-queries。
该函数传递两个参数(int?a,string b),并返回一个整数; DC.MyMethod(int?a,string b)
如何伪造这个?
//Fake datacontext
var fakeDC = Isolate.Fake.Instance<MyDataContext>();
//Fake --> this doesn't work
Isolate.WhenCalled((int? a, string b) => fakeDC.MyFunction(a,b).... ?
希望任何人都可以提供帮助
答案 0 :(得分:3)
Isolator默认忽略传递给函数的参数。要伪造你的,你可以简单地使用:
Isolate.WhenCalled(() => fakeDC.MyFunction(null, null)).WillReturn(...)
如果您需要确保使用特定参数调用它,请添加WithExactArguments()
,如下所示:
int? id = 10;
string name = "David";
Isolate.WhenCalled(() => fakeDC.MyFunction(id, name)).WithExactArguments().WillReturn(...);
希望有所帮助。
答案 1 :(得分:1)
免责声明,我在Typemock工作。
为了避免异常,你应该伪装MyDataContext的所有未来的实例:
var fakeDC = Isolate.Fake.AllInstances<MyDataContext>();
然后设置MyFunction()的行为:
int? id = 10;
string name = "David";
Isolate.WhenCalled(() => fakeDC.MyFunction(id, name)).WithExactArguments().WillReturn(..);
它确保MyDataContext的所有实例都是伪造的(由程序的任何部分中的新MyDataContext()创建),并且MyFunction()行为也将被伪造。
由于我不了解所有细节,请查看以下示例以获得更多理解:
internal class Foo
{
public Foo()
{
}
public int Bar()
{
var x = new MyDataContext();
return x.MyFunction(null, "5");
}
}
public class MyDataContext : DataContext
{
//
public int MyFunction(int? a, string b)
{
if(a == null)
{
throw new Exception();
}
return 0;
}
}
[TestMethod, Isolated]
public void TestMyDataContext()
{
//Arrange
var fakeDC = Isolate.Fake.AllInstances<MyDataContext>();
Isolate.WhenCalled(() => fakeDC.MyFunction(null, "5")).WithExactArguments().WillReturn(6);
//Act
var foo = new Foo();
var res = foo.Bar();
//Assert
Assert.AreEqual(6, res);
}
查看我们docs。
中的所有信息