请我在测试这种方法时遇到麻烦。

public class EFUrlRepository : IUrlsRepository
{
     public EFDbContext context = new EFDbContext();
     private Security security = new Security();
     public IQueryable<Url> Urls
     {
        get { return context.Urls; }
     }

     public bool AddUrl(Url url)
     {
          if(url.UrlId == 0)
          {
              context.Urls.Add(url);
              context.SaveChanges();
              url.UrlCode = security.Encrypt(url.UrlId.ToString());
              context.SaveChanges();
              return true;
          }
          return false;
     }
}

我正在尝试测试上述类的addUrl。我尝试按照Here的说明实现
[TestMethod]
public void CreateUrl_saves_a_url_via_context()
{
    var mockSet = new Mock<DbSet<Url>>();
    var mockContext = new Mock<EFDbContext>();
    mockContext.Setup(m => m.Urls).Returns(mockSet.Object);

    var repository = new EFUrlRepository();
    Url url = new Url()
                     {
                         UrlCode = "TYUyR",
                         OriginalUrl = "https://fluentvalidation.com",
                         IpAddress = "127.0.0.1",
                         PostedDate = DateTime.Now
                     };
    repository.context = mockContext.Object;


    repository.AddUrl(url);

    mockSet.Verify(m => m.Add(It.IsAny<Url>()), Times.Once());
    mockContext.Verify(m => m.SaveChanges(), Times.Once());
}

我的测试失败,并引发上面标题中提到的异常。请可能是什么问题。我怀疑我的EFDContext绑定(bind),但是我不知道该怎么做。我不确定我哪里出错了。任何帮助,将不胜感激。

最佳答案

AddUrl方法中,您两次调用SaveChanges方法。
要验证此行为,您需要更改:

mockContext.Verify(m => m.SaveChanges(), Times.Once());

进入:
mockContext.Verify(m => m.SaveChanges(), Times.Exactly(2));

您可以阅读有关Times选项here的信息

关于c# - 预期对模拟进行一次调用,但是两次调用: m => m. SaveChanges(),UnitTest,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31523431/

10-10 23:53