def METHOD_NAME(self):
    # get a real honest-to-goodness chdict from the fake db
    yield self.master.db.insert_test_data(self.change23_rows)
    chdict = yield self.master.db.changes.getChange(23)
    exp = self.change23
    got = yield changes.Change.fromChdict(self.master, chdict)
    # compare
    ok = True
    ok = ok and got.number == exp.number
    ok = ok and got.who == exp.who
    ok = ok and got.committer == exp.committer
    ok = ok and sorted(got.files) == sorted(exp.files)
    ok = ok and got.comments == exp.comments
    ok = ok and got.revision == exp.revision
    ok = ok and got.when == exp.when
    ok = ok and got.branch == exp.branch
    ok = ok and got.category == exp.category
    ok = ok and got.revlink == exp.revlink
    ok = ok and got.properties == exp.properties
    ok = ok and got.repository == exp.repository
    ok = ok and got.codebase == exp.codebase
    ok = ok and got.project == exp.project
    if not ok:
        def printable(c):
            return pprint.pformat(c.__dict__)
        self.fail(f"changes do not match; expected\n{printable(exp)}\ngot\n{printable(got)}")