如何使用TypeMock隔离器创建数据上下文方法

本文关键字:数据 上下文 方法 创建 何使用 TypeMock 隔离 | 更新日期: 2023-09-27 17:50:10

我想测试一个使用Linq to SQL的类。我已经用TypeMock Isolator伪造了数据上下文,但是数据上下文也有一个我不知道如何伪造的函数。此函数用于Linq to sql查询。

函数传递两个参数(int?A,字符串b),并返回一个整数;DC.MyMethod (int ?A、字符串b)

我该怎么做?

//Fake datacontext
var fakeDC = Isolate.Fake.Instance<MyDataContext>();
//Fake --> this doesn't work
Isolate.WhenCalled((int? a, string b) => fakeDC.MyFunction(a,b).... ?

希望有人能帮忙

如何使用TypeMock隔离器创建数据上下文方法

隔离器默认忽略传递给函数的参数。你可以简单地使用:

Isolate.WhenCalled(() => fakeDC.MyFunction(null, null)).WillReturn(...)

如果您需要确保使用特定参数调用它,请添加WithExactArguments(),如下所示:

int? id = 10;
string name = "David";
Isolate.WhenCalled(() => fakeDC.MyFunction(id, name)).WithExactArguments().WillReturn(...);

希望对你有帮助。

免责声明,我在Typemock工作。

为了避免异常,你应该设置MyDataContext的所有实例:

var fakeDC = Isolate.Fake.AllInstances<MyDataContext>();

然后设置MyFunction()的行为:

int? id = 10;
string name = "David";
Isolate.WhenCalled(() => fakeDC.MyFunction(id, name)).WithExactArguments().WillReturn(..);

它确保MyDataContext的所有实例将被伪造(由new 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);
 }