请我在测试这种方法时遇到麻烦。
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/