using System; using System.IO; using Xunit; namespace UsingDelegatesToImproveTestCode { public class Project { internal Project() {} public string Server { get; set; } public string Username { get; set; } public string Password { get; set; } internal void Save(string path) { File.WriteAllText(path, "Server=" + Server); } } public class Service { public bool Started { get; set; } string Project; public void LoadProject(string path) { Project = path; } public void Start() { Started = true; } public void Stop() { Started = false; } internal Service() { Started = false; } internal bool Connect() { return true; //it doesn't really matter } } public class Project_Execute_Tests_Standard { [Fact] public void Project_Can_Login_And_Can_Connect() { string path = System.IO.Path.GetRandomFileName(); Service service = null; try { Project project = new Project(); project.Server = "Test"; project.Username = "Admin"; project.Password = "Password"; project.Save(path); service = new Service(); service.Start(); service.LoadProject(path); bool connect = service.Connect(); Assert.True(connect); } finally { if(service != null && service.Started) service.Stop(); File.Delete(path); } } } public class Project_Execute_Tests_HelperMethods { private static string CreateProject() { string path = System.IO.Path.GetRandomFileName(); Project project = new Project(); project.Server = "Test"; project.Username = "Admin"; project.Password = "Password"; project.Save(path); return path; } private static Service GetService(string path) { Service service; service = new Service(); service.Start(); service.LoadProject(path); return service; } [Fact] public void Project_Can_Login_And_Can_Connect() { string path = string.Empty; Service service = null; try { path = CreateProject(); service = GetService(path); bool connect = service.Connect(); Assert.True(connect); } finally { if (service != null && service.Started) service.Stop(); File.Delete(path); } } } public class Project_Execute_Tests_Delegate { [Fact] public void Project_Can_Login_And_Can_Connect() { ServiceTester tester = new ServiceTester(); tester.CreateProject(delegate(Project project) { project.Server = "Test"; project.Username = "Admin"; project.Password = "Password"; }); tester.CreateProject(p => { p.Server = "Test"; p.Username = "Admin"; p.Password = "Password"; }); bool connect = tester.ConnectToService(); Assert.True(connect); } } public class ServiceTester : IDisposable { public string ProjectPath { get; set; } Service service = null; public delegate void ProjectDelegate (Project project); public void CreateProject(ProjectDelegate ProjectSettings) { ProjectPath = System.IO.Path.GetRandomFileName(); Project project = new Project(); ProjectSettings(project); project.Save(ProjectPath); } internal bool ConnectToService() { if (string.IsNullOrEmpty(ProjectPath)) throw new AssertException("You need to create a project before connecting to the service"); service = new Service(); service.Start(); service.LoadProject(ProjectPath); return service.Connect(); } public void Dispose() { if (service != null && service.Started) service.Stop(); File.Delete(ProjectPath); } } }