using Model; using Moq; namespace UTests3; public class UnitTests { [Fact] public async Task Test_AddNewNounours_Success() { var nounours = new Nounours("chucky.chucky@hell.com"); //setup the mocks var mockStore = new Mock(); mockStore.Setup(store => store.Add(nounours)).ReturnsAsync(() => nounours); var mockEmailService = new Mock(); //mockEmailService.Setup(service => service.AskConfirmation(nounours)); //setup the subject-under-test NounoursManager mgr = new NounoursManager(mockStore.Object, mockEmailService.Object); //execute the method to test bool result = await mgr.AddNewNounours(nounours); //assert the interactions went correctly Assert.True(result); mockStore.Verify(store => store.Add(nounours), Times.Once); mockStore.Verify(store => store.Remove(nounours), Times.Never); mockEmailService.Verify(store => store.AskConfirmation(nounours), Times.Once); } [Fact] public async Task Test_AddNewNounours_Fail_AlreadyExists() { var nounours = new Nounours("chucky.chucky@hell.com"); //setup the mocks var mockStore = new Mock(); mockStore.Setup(store => store.Add(nounours)).ReturnsAsync(() => null); //mockStore.Setup(store => store.Remove(nounours)).ReturnsAsync(true); var mockEmailService = new Mock(); //setup the subject-under-test NounoursManager mgr = new NounoursManager(mockStore.Object, mockEmailService.Object); //execute the method to test bool result = await mgr.AddNewNounours(nounours); //assert the interactions went correctly Assert.False(result); mockStore.Verify(store => store.Add(nounours), Times.Once); mockStore.VerifyNoOtherCalls(); mockEmailService.VerifyNoOtherCalls(); } [Fact] public async Task Test_AddNewNounours_Fail_BadEmail() { var nounours = new Nounours("chucky.chucky@hell.com"); //setup the mocks var mockStore = new Mock(); mockStore.Setup(store => store.Add(nounours)).ReturnsAsync(() => nounours); mockStore.Setup(store => store.Remove(nounours)).ReturnsAsync(true); var mockEmailService = new Mock(); mockEmailService.Setup(service => service.AskConfirmation(nounours)).Throws(); //setup the subject-under-test NounoursManager mgr = new NounoursManager(mockStore.Object, mockEmailService.Object); //execute the method to test bool result = await mgr.AddNewNounours(nounours); //assert the interactions went correctly Assert.False(result); mockStore.Verify(store => store.Add(nounours), Times.Once); mockStore.Verify(store => store.Remove(nounours), Times.Once); mockStore.VerifyNoOtherCalls(); mockEmailService.Verify(service => service.AskConfirmation(nounours), Times.Once); mockEmailService.VerifyNoOtherCalls(); } [Fact] public async Task Test_AddNewNounours_Fail_ExceptionWhenRemoving() { var nounours = new Nounours("chucky.chucky@hell.com"); //setup the mocks var mockStore = new Mock(); mockStore.Setup(store => store.Add(nounours)).ReturnsAsync(() => nounours); mockStore.Setup(store => store.Remove(nounours)).ReturnsAsync(false); var mockEmailService = new Mock(); mockEmailService.Setup(service => service.AskConfirmation(nounours)).Throws(); //setup the subject-under-test NounoursManager mgr = new NounoursManager(mockStore.Object, mockEmailService.Object); //assert it throws an exception _ = await Assert.ThrowsAsync(async () => await mgr.AddNewNounours(nounours)); mockStore.Verify(store => store.Add(nounours), Times.Once); mockStore.Verify(store => store.Remove(nounours), Times.Once); mockStore.VerifyNoOtherCalls(); mockEmailService.Verify(service => service.AskConfirmation(nounours), Times.Once); mockEmailService.VerifyNoOtherCalls(); } }