0

我不熟悉嘲笑。我想测试我的方法 GetById 是否返回一个带有 Id 的对象用户。在代码下方,我想测试 GetById(10) 是否返回一个 id = 10 的用户。

我设置了起订量(我希望它是正确的)但是如何执行起订量?

谢谢,

[TestMethod]
public void MyMoq()
{
    var userMock = new Mock<IUsers>();
    userMock.Setup(x => x.GetById(10)).Returns(new User());

    //After ?
    new Users().GetById(10);
}

public interface IUsers
{
    IUser GetById();
}

public IUser GetById(int id)
{
    using (var context = ....)
    {
        //code here

        //return user here
    }
}
4

4 回答 4

0

我不太确定你想测试什么。您还有 Mock 类,其中包含一些您未描述的方法。

但是,回答你关于嘲笑的问题。考虑这个类:

public class MyMoq : IUsers
{
  private readonly Mock<IUsers> userMock;
  public MyMoq(Mock<IUsers> userMock){
    this.userMock = userMock;
  }

  [TestMethod]
  public IUser GetById()
  {
      userMock.Setup(x => x.GetById(10)).Returns(new User());

      //After ?
      return new UsersDb().GetById(10);
  }
}

要使用它:

MyMoq moq = new MyMoq(new Mock<IUsers>());
User u = moq.GetById();

我在这个例子中的假设Mock<IUsers>是一个存储库并且MyMoq是一个服务类。此外,IUser是一个实体接口,IUsers是一个服务接口。

于 2013-04-03T09:20:58.920 回答
0

测试userMock.Object应该返回实际的模拟IUsers对象。

var userMock = new Mock<IUsers>();
userMock.Setup(x => x.GetById(10)).Returns(new User());

var mockobject = userMock.Object;

//Returns your mocked new User() instance
var newUserObject = mockobject.GetById(10); 

在上面的代码中,newUserObject只创建了一个新的User. 要测试您的GetById方法,您需要再次调用它并断言。

Assert.AreEqual(newUserObject.GetById(20).ID, 20);  //Assume User has a property ID

建议:应该可以有更好的方法来创建User实例。

于 2013-04-03T09:23:19.293 回答
0

如果这是正在测试的,GetById 应该在它自己的类(可能称为用户)中。然后用户可以在构造函数中接受上下文。然后模拟此上下文以返回存根数据。

所以总而言之

实现 IUsers 的用户类用户有一个带有参数 IContext 的构造函数(或者在这里调用的任何东西) 测试类将模拟 IContext 但不是 IUsers。调用 users.GetById 并检查输出是否正确。

您设置上下文的方式取决于它是什么类型的上下文,但请参阅https://cuttingedge.it/blogs/steven/pivot/entry.php?id=84

于 2013-04-03T09:36:52.317 回答
0

好吧,正如我在评论中所说,我不清楚您要测试什么代码。我在这里看到两个选项。1)Users该类实现IUsers接口,您的意图是测试GetById(int)方法的实现。在这种情况下,您不需要模拟 'Users#GetById(id)' 方法,您只需要调用它并检查结果。代码应类似于:

interface IUser
{
    int Id { get; }
}
class User : IUser
{
    public int Id { get;set; }
}

interface IUsers
{
    IUser GetById(int id);
}
class Users : IUser
{
    public IUser GetById(int id)
    {
        // TODO: make call db call
        // TODO: parse the result
        // TODO: and return new User instance with all the data from db
        return new User{ Id = id };
    }
}

[TestMethod]
public void MyMoq()
{   
    // TODO: prepare/mock database. That's whole another story.

    var users = new Users();

    // act
    var user = users.GetById(10);

    // assert
    Assert.AreEqual(10, user.Id);
}

2)您的Users#GetById(int)方法应该调用IUsers#GetById(int)并返回结果。在这种情况下,您需要创建模拟IUsers(如您在问题中所示)并将其传递给Users. 代码应该是(抱歉可能重复):

interface IUser
{
    int Id { get; }
}
class User : IUser
{
    public int Id { get;set; }
}

interface IUsers
{
    IUser GetById(int id);
}
class Users : IUser
{
    private readonly IUser _users;
    public Users(IUser users)
    {
        _users = users;
    }

    public IUser GetById(int id)
    {
        // next line of code is to be tested in unit test
        return _users.GetById(id);
    }
}

[TestMethod]
public void MyMoq()
{   
    var usersMock = new Mock<IUsers>();
    usersMock.Setup(x => x.GetById(10)).Returns(new User());

    var users = new Users(usersMock.Object);

    // act
    var user = users.GetById(10);

    // assert
    Assert.AreEqual(10, user.Id);
}

ps 查看起订量教程单元测试艺术一书(第 47 页)可能很有用Part 2 - Core techniques- 存根、模拟等。

于 2013-04-03T09:47:56.820 回答