CodePaste Logo
New Snippet New Snippet Recent Snippets Recent Snippets My Snippets My Snippets Web Code Search Snippets Search
Sign inor Register
Language: C#

Refactored tests and added funcationlity

222 Views
Copy Code Show/Hide Line Numbers
public class EnableArtistTrackActionSpecs
{
    private readonly Playlist playlistFake;
    private readonly ArtistTrack trackToEnable;
 
    public EnableArtistTrackActionSpecs()
    {
        playlistFake = new Playlist();
        trackToEnable = MockRepository.GenerateStub<ArtistTrack>();
    }
 
    private ArtistTrackEnabler GetArtistTrackEnabler(IPlaylistRepository playlists)
    {
        ArtistTrackEnabler.FileDoesNotExist = (track) =>
        {
            return false;
        };
 
        return new ArtistTrackEnabler(playlists); 
    }
 
    [Test]
    public void Execute_GivenDisabledArtistTrack_ShouldMeetEnabledCriteria()
    {
        IPlaylistRepository playlists = MockRepository.GenerateStub<IPlaylistRepository>();
        ArtistTrackEnabler sut = GetArtistTrackEnabler(playlists);
 
        int initialTrackCount = playlistFake.Tracks.Count;
 
        sut.Enable(trackToEnable, playlistFake);
 
        int resultingTrackCount = playlistFake.Tracks.Count;
 
        Assert.AreEqual(initialTrackCount + 1, resultingTrackCount);
    }
 
    [Test]
    public void Execute_GivenDisabledArtistTrack_ShouldCallUpdateOnPlaylistRepository()
    {
        IPlaylistRepository playlists = MockRepository.GenerateMock<IPlaylistRepository>();
        ArtistTrackEnabler sut = GetArtistTrackEnabler(playlists);
 
        sut.Enable(trackToEnable, playlistFake);
 
        playlists.AssertWasCalled(p => p.Update(playlistFake));
    }
 
    [Test]
    public void Execute_GivenTrackWhereFileDoesNotExist_ShouldNotAddTrackToPlaylist()
    {
        ArtistTrackEnabler sut = GetArtistTrackEnabler(null);
 
        ArtistTrackEnabler.FileDoesNotExist = (track) =>
        {
            return true;
        };
 
        int initialTrackCount = playlistFake.Tracks.Count;
 
        sut.Enable(trackToEnable, playlistFake);
 
        int resultingTrackCount = playlistFake.Tracks.Count;
 
        Assert.AreEqual(initialTrackCount, resultingTrackCount);            
    }
}
 
public class ArtistTrackEnabler
{
    private readonly IPlaylistRepository playlists;
 
    public ArtistTrackEnabler()
        : this(IoC.Resolve<IPlaylistRepository>())
    {
        
    }
 
    public static Func<ArtistTrack, bool> FileDoesNotExist = (track) =>
    {
        var pathToFile = Locate.File(track.FileName)
            .Of(FileType.Audio).In(Location.Local)
            .For(track.Artist);
 
        return !File.Exists(pathToFile);
    };
 
    public ArtistTrackEnabler(IPlaylistRepository playlists)
    {
        this.playlists = playlists;
    }
 
    public void Enable(ArtistTrack track, Playlist playlist)
    {
        if (TrackDoesNotPassEnablingCriteria(track))
            return;
 
        playlist.Add(track);
        playlists.Update(playlist);
    }
 
    public virtual bool TrackDoesNotPassEnablingCriteria(ArtistTrack track)
    {
        if (FileDoesNotExist(track))
            return true;
 
        // Going to be adding more here... Specification pattern and inject criteria?
        return false;
    }
}
by Scott Muc
  October 29, 2009 @ 3:40pm
Tags:
Description:
Looks like the testing is driving out some better design...

Add a comment


Report Abuse
brought to you by:
West Wind Techologies



If you find this site useful and use it frequently please consider making a donation to support this free service.
Donate