这是另一个新秀菜鸟问题:
请考虑以下事项:
INNER JOIN
因此,在存储库中,如果它成功创建数据库,则返回TRUE。如果所有SQL UPDATE也成功,则UpdateTable也是如此。然后,我正在做的就是将结果传递回ViewModel以表明一切顺利。
所以在我的MSTest中:
public class Company
{
public string CompanyName {get; set; }
public string Address {get; set; }
}
public interface IRepository
{
bool CreateDatabase(string name);
bool UpdateTable(Company _co);
}
public class MyService
{
private IRepository _repo;
public MyService(IRepository repo)
{
_repo = repo;
}
public bool Commit(string database_name, Company co)
{
if (_repo.CreateDatabase(database_name))
return _repo.Commit(co);
return false;
}
}
这是事情变得如此糟糕的地方。结果返回true,这意味着它返回了正确的结果,但是Moq验证失败了,我得到了这个例外:
模拟上的预期调用至少一次,但从未执行过:r => r.CreateDatabase( “测试”)
为什么?即使我删除了Times.Once并且只有 [TestMethod]
public void Test_If_Calls_CreateDatabase_And_UpdateTable()
{
var name = "test";
var repoMock = new Mock<IRepository>();
var _company = new Company();
repoMock.Setup(r => r.CreateDatabase(It.IsAny<string>())).Returns(true);
repoMock.Setup(r => r.UpdateCompanyTable(It.IsAny<Company>())).Returns(true);
var engine = new MyService(repoMock.Object);
var result = engine.Commit(name, _company);
Assert.IsTrue(result); // PASSES
repoMock.Verify(r => r.CreateDatabase(name), Times.Once); //FAILS
repoMock.Verify(r => r.UpdateCompanyTable(_company), Times.Once); //FAILS
}
,我仍然会收到相同的失败错误消息。
有什么建议吗?
代码确实是第一个建议的答案。但是有一些复制和粘贴错误悄悄进入,这是因为我正在尝试一些变化来使单元测试工作。例如,我尝试过这些变化:
repoMock.Verify(r => CreateDatabase(name))
我原本以为第一行会像有人建议的那样工作,但事实并非如此,因此我在这里寻求一些帮助。
答案 0 :(得分:2)
实际上,正是Chetan Ranpariya在评论中提出了答案,我希望他会发布一个建议的答案,而不是我,所以我可以给他信用。
因为我正在使用It.IsAny<string>()
和It.IsAny<Company>()
,所以在尝试验证方法确实运行一次时,我需要拥有SAME签名。因此,为了测试它,应该是这样的:
repoMock.Verify(r => r.CreateDatabase(It.IsAny<string>()), Times.Once);
repoMock.Verify(r => r.UpdateCompanyTable(It.IsAny<Company>()), Times.Once);
现在测试通过了。
谢谢Chetan!