Clock Pattern

Leave a comment

Here is an old pattern I used to use in C# whenever I wanted to freeze time in a test, and then verify that something happened after.

You define a Clock object where you can freeze and set the time. Then whenever you want a time in your system or in tests you simply ask it for it’s time.

DateTime now = Clock.CurrentTime();

Or in a test you can do something like this.

  [Fact]
        public void When_updating_a_user()
        {
            using(Clock.Freeze())
            {
                // Add user at this time
                DateTime currentTime = Clock.CurrentTime();
                fixture.Add(randomUserName);

                // Update user 5 minutes later
                Clock.Add(new TimeSpan(0, 5, 0));
                DateTime newCurrentTime = Clock.CurrentTime();
                repository.UpdateUser(new User(randomUserName, true));

                User user = repository.FindBy(randomUserName);
                Assert.Equal(principalUserName, user.CreatedBy);
                Assert.Equal(currentTime, user.CreatedDate);
                Assert.Equal(principalUserName, user.ModifiedBy);
                Assert.Equal(newCurrentTime, user.ModifiedDate);
            }
        }

Clock

using System;

namespace src.utils
{
    public class Clock
    {
        private static bool timeFrozen;
        private static DateTime currentTime;

        public static UnFreezeClock Freeze()
        {
            DateTime now = DateTime.Now;
            return Freeze(new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second));
        }

        public static UnFreezeClock Freeze(DateTime time)
        {
            timeFrozen = true;
            currentTime = time;

            return new UnFreezeClock();
        }

        public static DateTime CurrentTime()
        {
            if (timeFrozen)
                return currentTime;
            else
                return DateTime.Now;
        }

        public static void Add(TimeSpan timeSpan)
        {
            if (timeFrozen)
                currentTime = currentTime.Add(timeSpan);
        }

        public static void Unfreeze()
        {
            timeFrozen = false;
            currentTime = DateTime.Now;
        }
    }
}

How to simple Html.DropDownListFor MVC.NET

19 Comments

dropdownlist-mvc

I find the Html helper APIs for ASP.NET MVC ackward and confusing. That’s why I like creating these little examples to figure out what is going on.

Here is a simple example of how to create a drop down list in ASP.NET MVC using Html.DropDownListFor.

You can do it like this all inlined in your *.cshtml file like so:

@Html.DropDownListFor(model => model.Package.State, new SelectList(
                  new List<Object>{ 
                       new { value = 0 , text = "Red"  },
                       new { value = 1 , text = "Blue" },
                       new { value = 2 , text = "Green"}
                    },
                  "value",
                  "text",
                   2))

With produces this:

<select id="Package_State" name="Package.State"><option value="0">Red</option>
<option value="1">Blue</option>
<option value="2">Green</option>
</select>

The model => model.Package.State expression is used to generate the id and name on the select.

The string value and text matter as they need to match the model attributes of the listItem in the list.

Or you can create your own List collection (with different fields for value and text) in your controller, set it on you model, and then use in your view like this:

    @Html.DropDownListFor(model => model.Package.State.Id, new SelectList(
                  Model.PackageStates,
                  "id",
                  "name",
                  Model.Package.State.Id))

Longer version

Here is a more indepth example with break down using modesl, view and controller.

Model

I basically have x3 models.

PackageState – contains the state of my package (fake domain object I made up).
Package – contains the PackageState and whatever else I want to throw in there.
DashboardIndexModel – this is how I bundle everything in the controller to send to the view.

PackageState.cs

    [Serializable]
    public class PackageState
    {
        private PackageState(int id, string name)
        {
            this.Id = id;
            this.Name = name;
        }

        public int Id { get; set; }
        public string Name { get; set; }

        public static PackageState Received = new PackageState(1, "Received");
        public static PackageState Processing = new PackageState(2, "Processing");
        public static PackageState Complete = new PackageState(3, "Complete");
    }

Package.cs

    public class Package
    {
        public PackageState State { get; set; }

        public Package(PackageState state)
        {
            State = state;
        }
    }

DashboardIndexModel.cs

    public class DashboardIndexModel
    {
        public Package Package { get; set; }
        public IEnumerable<SelectListItem> PackageStates { get; set; } // dropdown
    }

Controller

Here is where I prepare my dropdown list. I could do the work in the view (like the short example above). But here I have chosen to do it in the controller to keep the view clean and because I want to be able to set which element in my drop down should be selected.

    public class DashboardController : Controller
    {
        //
        // GET: /Dashboard/

        public ActionResult Index()
        {
            PackageRepository.Package = new Package(PackageState.Complete);
            IList<PackageState> states = new List<PackageState>
                                             {PackageState.Received, PackageState.Processing, PackageState.Complete};

            int selectedStateId = 2; // hard code for demo

            IEnumerable<SelectListItem> selectList =
                from s in states
                select new SelectListItem
                           {
                               Selected = (s.Id == selectedStateId),
                               Text = s.Name,
                               Value = s.Id.ToString()
                           };

            // Do this if you don't care about selection
//            List<SelectListItem> selectList = states.Select(state => new SelectListItem {Value = state.Id.ToString(), Text = state.Name}).ToList();

            var model = new DashboardIndexModel { Package = PackageRepository.Package, PackageStates = selectList };
            return View(model);
        }
    }

View

And here is the view showing x2 ways to create the dropdown list.

Index.cshtml

@model Dashboard.Models.DashboardIndexModel

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<fieldset>
    <legend>Package</legend>

    <div class="display-field">
        @Html.DisplayFor(model => model.Package.State.Name)
    </div>
    
    @Html.DropDownListFor(model => model.Package.State.Id, new SelectList(
                  new List<Object>{ 
                       new { value = 0 , text = "Red"  },
                       new { value = 1 , text = "Blue" },
                       new { value = 2 , text = "Green"}
                    },
                  "value",
                  "text",
                   2))
    
    
    
    @Html.DropDownListFor(model => model.Package.State.Id, Model.PackageStates)
    
</fieldset>

So that’s it. A simple of a dropdown. Don’t worry if you find these helpers confusing at first (I know I did at first too). But creating little experiments like this, and viewing the HTML output helps the understanding.

Links that help

http://stackoverflow.com/questions/5554421/dropdownlist-selectlist-selectedvalue-issue
http://stackoverflow.com/questions/3057873/how-to-write-a-simple-html-dropdownlistfor
http://stackoverflow.com/questions/781987/how-can-i-get-this-asp-net-mvc-selectlist-to-work

How to quickly flip between virtual directories in IIS

Leave a comment

Say you’ve got two directory branches on your local machine (development and prod) and you want a simple way to quickly flip between them.

Justin Madill showed me this neat trick where you can create a virtual directory link and then simply flip between:

> mklink /d virtualDir trunk
or
> mklink /d virtualDir prod

Then have IIS just point to virtualDir, and simple delete and re-create the link depending on whether you want to point to trunk or prod.

To delete the link go:

> rd virtualDir

Static string lookups with enums containing spaces

3 Comments

Enums used to leave a bad taste in my mouth. Mostly because it didn’t support spaces in the enum names. For that reason if I always wanted to do simple name value lookup, I would use strings instead of enums.

But things have changed. Now, using a handy description attribute, you can describe enums with spaces in their names and look them up like any other string.

enum DocumentCategory
{
       Debit = 1,
       Credit = 2,
       [Description("N/A")]
       NotApplicable = 3
}

And then you can access and look things up with:

Enum.GetValues(typeof (DocumentCategory));
int id = (int) DocumentCategory.Debit;
string code = DocumentCategory.Debit.ToString();
var debitEnum = Enum.Parse(typeof (DocumentCategory), "Debit");

I realize this has been around for a while. I am just slow picking up on this kind of stuff. Thanks to Ghassan Karwchan for pointing this out to me.

This is how I used to do it (old school):

    public class DocumentCategory : BaseLookup<DocumentCategory>
    {
        public static DocumentCategory Debit = new DocumentCategory(1, "Debit");
        public static DocumentCategory Credit = new DocumentCategory(2, "Credit");
        public static DocumentCategory NotApplicable = new DocumentCategory(3, "N/A");

        private DocumentCategory(int id, string name) : base(id, name) { }        
    }

    public abstract class BaseLookup<T> where T: BaseLookup<T> 
    {
        protected int id;
        protected string name;

        protected BaseLookup(int id, string name)
        {
            this.id = id;
            this.name = name;
        }

        protected BaseLookup()
        {
        }
        
        public int Id
        {
            get { return id; }
        }

        public string Name
        {
            get { return name; }
        }

        public static List<T> List()
        {
            return typeof (T)
                .GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly)
                .Select(property => property.GetValue(typeof (T)) as T).ToList();
        }

        public static int LookupId(string name)
        {
            var lookup = List().Where(lkp => lkp.name == name).FirstOrDefault();
            return lookup == null ? 0 : lookup.id;

        }

        public static string LookupName(int id)
        {
            var lookup = List().Where(lkp => lkp.id == id).FirstOrDefault();
            return lookup == null ? string.Empty : lookup.name;
        }

    }

Refactoring try catch statements in C#

3 Comments

Sometimeswhen you are writing C# you get a lot of code that looks like this:

        public int SaveDraft(DocumentDraftDto dto)
        {
            try
            {
                int id = task.SaveDraft(dto);
                context.StatusCode = HttpStatusCode.Created;
                return id;
            }
            catch (Exception e)
            {
                log.Error(string.Format("An error occurred when saving the draft for Username={0}.", dto.UpdateUser), e);
                context.StatusCode = HttpStatusCode.InternalServerError;
                return 0;
            }
        }

        public List<DocumentDraftDto> GetDrafts(string userId)
        {
            try
            {
                List<DocumentDraftDto> documentDraftDtos = task.GetDrafts(userId);
                context.StatusCode = HttpStatusCode.OK;
                return documentDraftDtos;
            }
            catch (Exception e)
            {
                log.Error(string.Format("An error occurred when retrieving drafts for UserId={0}.", userId), e);
                context.StatusCode = HttpStatusCode.InternalServerError;
                return null;
            }
        }

The same try/catch with the same code repeated again and again.

One way to clean this up is create on generic try catch statement, and pass a function of the method you want invoked to it:

        public int SaveDraft(DocumentDraftDto dto)
        {
            return CallDocumentDraftTask(x => x.SaveDraft(dto));
        }

        public List<DocumentDraftDto> GetDrafts(string userId)
        {
            return CallDocumentDraftTask(x => x.GetDrafts(userId));
        }

        private T CallDocumentDraftTask<T>(Func<IDocumentDraftTask, T> func)
        {
            try
            {
                T resurlt = func(task);
                context.StatusCode = func.Method.Name.Contains("SaveDraft") ? HttpStatusCode.Created : HttpStatusCode.OK;
                return resurlt;
            }
            catch (Exception e)
            {
                log.Error(string.Format("An error occurred when " + func.Method.Name), e);
                context.StatusCode = HttpStatusCode.InternalServerError;
                return default(T);
            }
        }

There. Much cleaner. And less noise. And less code to maintain.

Thanks to Allan Wu for showing me this.

How to return Json data from MVC controller

5 Comments

// AJAX: Called by the JqGrid control
public ActionResult Grid(JqGridSearchCriteria criteria)
{

 var draftJson = new {
      total = 1,
      page = 1,
      records = 1,
      rows = new[]
      {
       new{
          id = 8,
          cell = new[]
          {
          "data1",
          "data2",
          "9/13/2010",
          }
          }
     },
};

   return Json(draftJson, JsonRequestBehavior.AllowGet);
}

Unit testing with generics

Leave a comment

Here’s handy NUnit test method I used today to check whether some variables were set before passing them to my service:

            public void InvalidInput(Action func)
            {
                func.Invoke();
                ServiceToTest.SaveDraft(dto);
                MockContext.VerifySet(x => x.StatusCode = HttpStatusCode.BadRequest);
            }

Used like this:

            [Test]
            public void Should_fail_blank_username()
            {
                InvalidInput(() => dto.UpdateUser = "");
            }

or

            [Test]
            public void Should_fail_blank_UserIds()
            {
                InvalidInput(() => dto.UserId = 0);
            }

I can use the same method for string and it’s by just passing the Action to the InvalidInput and invoking it and the other test code there.

You could also define the test method like this:

            public void TestCaseGeneric<T>(Func<T> func)
            {
                func.Invoke();
                ServiceToTest.SaveDraft(dto);
                MockContext.VerifySet(x => x.StatusCode = HttpStatusCode.BadRequest);
            }

But the action bit is pretty clean.

Older Entries

%d bloggers like this: