如何使用TypeMock Isolator伪造datacontext方法

时间:2011-04-12 06:56:36

标签: c# unit-testing typemock typemock-isolator

我想测试一个使用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).... ?

希望任何人都可以提供帮助

2 个答案:

答案 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

中的所有信息